ASP.. NET MVC 5使用ActiveDirectoryMembershipProvider和IsAuthent

本文关键字:ActiveDirectoryMembershipProvider IsAuthent 使用 NET MVC ASP | 更新日期: 2023-09-27 18:06:54

我正在使用ASP。. NET MVC 5与表单认证和AD成员资格提供程序如下:

<authentication mode="Forms">
      <forms name=".ADAuthCookie" loginUrl="~/Account/Login" defaultUrl="~/" timeout="20" slidingExpiration="true" protection="All" />
    </authentication>
    <membership defaultProvider="ADMembershipProvider">
      <providers>
        <clear/>
        <add name="ADMembershipProvider"
             type="System.Web.Security.ActiveDirectoryMembershipProvider"
             connectionStringName="ADConnectionString"
             attributeMapUsername="sAMAccountName" 
             enableSearchMethods="true" />
      </providers>
    </membership> 

我有匿名认证启用和Windows认证禁用

我可以成功地对AD进行身份验证,并且User.Identity.Name的值确实显示了我的用户名。然而IsAuthenticated是假的。为什么?

我想在布局中使用一些标志来显示/隐藏导航。现在,我在我的视图中使用这个:

@if (@User.Identity.Name == "") { show insecure content }

我使用我自己的Login方法,在我的AccountController中定义如下:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(Login model, string returnUrl = "")
{
    if (ModelState.IsValid)
    {             
        if (Membership.ValidateUser(model.UserName, model.Password))
        {
            _logger.Info("AccountController.Login() User.Identity.Name=" + User.Identity.Name);
            FormsAuthentication.RedirectFromLoginPage(model.UserName, model.RememberMe);
        }
        ModelState.AddModelError("", "Incorrect username and/or password");
    }
    return View(model);
}

我也不完全相信以下方法在我的/Logout中按预期工作:

HttpContext.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
FormsAuthentication.SignOut();  
Session.Abandon();

也许我没有完全理解User.Identity在使用ActiveDirectoryMembershipProvider时的预期行为。

ASP.. NET MVC 5使用ActiveDirectoryMembershipProvider和IsAuthent

如果您使用的是脚手架式MVC5应用程序,那么SignInAsync中有一个部分必须设置用于身份验证的声明标识。我不得不做一些改变,但它看起来像这样:

private async Task SignInAsync(ApplicationUser user, bool isPersistent)
        {
            AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
            var identity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, user.UserName), }, DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role);
            AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
        }

我遇到了同样的问题,并跟随这篇文章和其他一些人一起解决它:http://kevin-junghans.blogspot.com/2013/12/using-claims-in-aspnet-identity.html

我在之前的一篇文章中被告知MVC5取消了form auth而支持claim,我可能是错的,也许有人可以更清楚地说明这一点。