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

 2023-02-16    367  

问题描述

我正在尝试学习如何使用ASP.NET身份.我的场景是我必须对Active Directory进行身份验证.为此目的,我试图使用ActiveDirecotoryMembershipProvider.我要做的是 –

  1. 对Active Directory进行身份验证用户/密码.
  2. 检查用户是否存在于我自己的数据库中.

我的方式是我在我的web.config中配置了使用ActiveDirectoryMembershipProvider作为默认会员提供程序.然后我覆盖我ApplicationSignInManager类(继承SignInManager)中的PasswordSignInAsync方法,如下所示 –

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

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里面调用empersep Validate方法.我同意这一点.事实上,我认为覆盖方法也是错误的.

还建议我使用UserLogins我会给我的广告提供商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.

推荐答案

您不希望使用身份将成员身份提复.您最可能做的是,类似于身份对待其他外部登录(如Google/Facebook)的attemirectory的登录.

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

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

如果您只能通过广告登录,那么您确实可以覆盖passwordsignin,以显式验证AD

否则,您只需要在AD的特定登录流中,保留现有本地密码/社交登录功能.

其他推荐答案

一步之后尝试,可能是它会有用.

以上所述是小编给大家介绍的如何在ASP.Net Identity中使用ActiveDirectoryMembershipProvider?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/33990.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。