th1*_*ey3 18 c# asp.net asp.net-membership asp.net-identity asp.net-identity-2
我正在尝试学习如何使用ASP.Net Identity.我的方案是我必须针对Active Directory进行身份验证.为此我想尝试使用ActiveDirecotoryMembershipProvider.我要做的是 - 
我这样做的方式是我在我的配置中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;
}
因此,如果我想针对多个提供者对用户进行身份验证,我可以为每个提供者创建提供者密钥,并将这些提供者密钥分配给用户.此代码将验证用户对它们的反应.但是我应该把这段代码放在哪里?我应遵循什么惯例?
我自己并不热衷于编写AD验证,因为我认为ActiveDirectoryMembershipProvider可以比我自己的代码做得更好.同样对于这两种情况我都要添加引用System.DirectoryServices.
| 归档时间: | 
 | 
| 查看次数: | 5679 次 | 
| 最近记录: |