繁体   English   中英

如何在ASP.Net Identity中使用ActiveDirectoryMembershipProvider?

[英]How to use ActiveDirectoryMembershipProvider with ASP.Net Identity?

我正在尝试学习如何使用ASP.Net Identity。 我的方案是我必须针对Active Directory进行身份验证。 为此我试图使用ActiveDirecotoryMembershipProvider 我要做的是 -

  1. 针对Active Directory验证用户/密码。
  2. 检查用户是否存在于我自己的数据库中。

我这样做的方法是在web.config配置使用ActiveDirectoryMembershipProvider作为默认成员资格提供程序。 然后我覆盖我的ApplicationSignInManager类(它继承了SignInManager )中的PasswordSignInAsync方法,如下所示 -

public override Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
{
    var adok = Membership.Provider.ValidateUser(userName, password);
    if (adok)
    {
        var user = UserManager.FindByName(userName);
        if (user == null)
            return Task.FromResult<SignInStatus>(SignInStatus.Failure);
        else
        {
            base.SignInAsync(user, isPersistent, shouldLockout);
            return Task.FromResult<SignInStatus>(SignInStatus.Success);
        }
    }
    else
        return Task.FromResult<SignInStatus>(SignInStatus.Failure);
}

这似乎有效。 但我认为这不是正确的做法。 有谁能建议任何更好的方法来实现这一目标?

UPDATE

以下是我如何称呼上述内容

var result = await SignInManager.PasswordSignInAsync(username, password, isPersistent: false, shouldLockout: false);
switch (result)
{
    case SignInStatus.Success:
        return RedirectToAction("Index", "Home");
    case SignInStatus.LockedOut:
        return View("Lockout");
    case SignInStatus.Failure:
    default:
        ModelState.AddModelError("", "Invalid login attempt.");
        return View();
}

根据我得到的答案,我不应该在PasswordSignInAsync调用Membership Validate方法。 我同意这一点。 事实上,我认为重写这个方法也是错误的。

还有人建议我使用UserLogins ,我会给我的AD提供者ID。 但我能想到使用它的唯一方法如下 -

IList<UserLoginInfo> loginInfos = await SignInManager.UserManager.GetLoginsAsync(username);
var valid = false;
foreach(var info in loginInfos)
{
    valid = Membership.Providers[info.ProviderKey].ValidateUser(username, password);
    if (valid) break;
}

因此,如果我想针对多个提供者对用户进行身份验证,我可以为每个提供者创建提供者密钥,并将这些提供者密钥分配给用户。 此代码将验证用户对它们的反应。 但是我应该把这段代码放在哪里? 我应遵循什么惯例?

我自己并不热衷于编写AD验证,因为我认为ActiveDirectoryMembershipProvider可以比我自己的代码做得更好。 同样对于这两种情况,我还是要添加对System.DirectoryServices引用。

您不希望将MembershipProviders与身份混合使用。 您最有可能想要做的是,记录到ActiveDirectory,类似于身份如何处理其他外部登录(如google / facebook)。

这基本归结为将AD用户名存储为登录名:

userManager.AddLogin(<userId>, new UserLoginInfo("ActiveDirectory", "<ADUserName>")

如果您只通过AD登录,那么您确实可以覆盖PasswordSignIn以显式验证AD

否则,您只希望在AD的特定登录流程中使用此功能,并保留现有的本地密码/社交登录功能。

尝试一下后续步骤,可能会对您有所帮助。

https://msdn.microsoft.com/en-us/library/ff650307.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM