首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在ASP.Net Identity中使用ActiveDirectoryMembershipProvider?

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

Stack Overflow用户
提问于 2015-04-27 14:18:30
回答 2查看 6.9K关注 0票数 19

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

无论用户是否存在于我自己的数据库中,

  1. 都会根据Active Directory.
  2. Check验证用户/密码。

我这样做的方法是在我的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);
}

这似乎是可行的。但我认为这不是正确的做法。有没有人能提出更好的方法来实现这一点?

更新

下面是我如何调用上面提到的

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内部调用成员资格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;
}

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

我自己并不热衷于编写广告验证代码,因为我认为ActiveDirectoryMembershipProvider可以比我自己的代码做得更好。另外,对于这两种情况,我都必须添加对System.DirectoryServices的引用。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29888503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档