如何使用带有ASP.NET标识的ActiveDirectoryMembershipProvider?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (41)

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

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

我做了它的方式是我在配置web.config使用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在里面调用Membership 方法PasswordSignInAsync。我同意这一点。事实上,我认为压倒一切的方法也是错误的。

还有人建议我使用UserLogins我要给我的广告提供商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的特定登录流程中使用此功能,即可保留现有的本地密码/社交登录功能。

扫码关注云+社区