我正在尝试学习如何使用ASP.Net Identity。我的方案是我必须根据Active Directory进行身份验证。为此,我尝试使用ActiveDirecotoryMembershipProvider
。我要做的是-
无论用户是否存在于我自己的数据库中,
我这样做的方法是在我的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
的引用。
发布于 2015-05-11 13:30:17
你不想把MembershipProviders和identity混为一谈。你最可能想做的是,对待登录ActiveDirectory的方式,就像对待identity对待其他外部登录一样(比如google/facebook)。
这基本上归结为将AD用户名存储为登录名:
userManager.AddLogin(<userId>, new UserLoginInfo("ActiveDirectory", "<ADUserName>")
如果您只通过AD登录,那么您确实可以通过显式validate against AD覆盖PasswordSignIn
否则,您只希望在AD的特定登录流中执行此操作,同时保留现有的本地密码/社交登录功能。
发布于 2015-05-07 12:51:42
在下面的步骤中尝试一下,可能会对你有所帮助。
https://stackoverflow.com/questions/29888503
复制相似问题