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

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

  • 我的操作方式是在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,在该处给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;
    }
    

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

    我不希望自己编写AD验证代码,因为我认为ActiveDirectoryMembershipProvider可以比我自己的代码做得更好。同样对于这两种情况,无论如何,我都必须添加对System.DirectoryServices的引用。

    最佳答案

    您不想将MembershipProviders与身份混合在一起。您最可能想做的是,对待登录ActiveDirectory的方式类似于身份对待其他外部登录名(例如google/facebook)的方式。

    基本上可以归结为将AD用户名存储为登录名:
    userManager.AddLogin(<userId>, new UserLoginInfo("ActiveDirectory", "<ADUserName>")
    如果仅通过AD登录,则实际上可以覆盖PasswordSignIn来显式validate against AD

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

    关于c# - 如何在ASP.Net Identity中使用ActiveDirectoryMembershipProvider?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29888503/

    10-16 07:56