如何将 ActiveDirectoryMembershipProvider 与 ASP.NET Identity 结合使用?

2024-02-28

我正在学习使用 .NET Identity。我必须向 Active Directory 进行身份验证。为此目的我正在尝试使用ActiveDirecotoryMembershipProvider。我必须:

  1. 验证用户/密码活动目录 https://en.wikipedia.org/wiki/Active_Directory (AD).
  2. 检查用户是否存在于我自己的数据库中。

我在我的中配置了它web.config to use ActiveDirectoryMembershipProvider作为默认的会员提供商。然后我就推翻了PasswordSignInAsync方法在我的ApplicationSignInManager类(继承SignInManager) 如下 -

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);
}

这似乎有效。但我认为这不是正确的做法。有更好的方法来实现这一目标吗?

这是我如何调用上面提到的:

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();
}

根据我得到的答案,我不应该打电话给会员Validate里面的方法PasswordSignInAsync。我同意这一点。事实上,我认为重写该方法也是错误的。

也有人建议我使用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 anyway.


您不想将 MembershipProviders 与身份混合在一起。您最可能想要做的是将登录 ActiveDirectory 视为类似于身份处理其他外部登录(如 google/facebook)的方式。

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

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

如果您仅通过 AD 登录,那么您确实可以覆盖 PasswordSignIn 来明确针对 AD 进行验证 https://stackoverflow.com/questions/290548/validate-a-username-and-password-against-active-directory

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 ActiveDirectoryMembershipProvider 与 ASP.NET Identity 结合使用? 的相关文章

随机推荐