gpt4 book ai didi

c# - 如何将 ActiveDirectoryMembershipProvider 与 ASP.NET Identity 一起使用?

转载 作者:IT王子 更新时间:2023-10-29 04:50:39 26 4
gpt4 key购买 nike

我正在学习使用 .NET Identity。我必须向 Active Directory 进行身份验证。为此,我正在尝试使用 ActiveDirecotoryMembershipProvider。我必须:

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

我在 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 中调用 Membership 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;
}

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

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

最佳答案

您不想将 MembershipProvider 与身份混合在一起。您最有可能想要做的是像对待身份对待其他外部登录(如 google/facebook)的方式一样对待登录到 ActiveDirectory。

这基本上归结为将 AD 用户名存储为登录名:

userManager.AddLogin(<userId>, new UserLoginInfo("ActiveDirectory", "<ADUserName>")

如果您只通过 AD 登录,那么您确实可以覆盖 PasswordSignIn 以显式 validate against AD

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com