带有 LDAP 身份验证的 OWIN

2024-01-04

这是我的场景。我有一个使用 Owin 作为身份验证机制的 MVC 5 应用程序。默认模板在登录操作中调用 SignInManager.PasswordSignInAsync,我想覆盖该操作以使用 LDAP 验证用户,而不是查看数据库。

我可以通过以下方式进行验证:

PrincipalContext dc = new PrincipalContext(ContextType.Domain, "domain.com", "DC=domain,DC=com", "user_name", "password");
        bool authenticated = dc.ValidateCredentials(userName, password);

然后我可以使用以下方法检索 UserPrincipal:

UserPrincipal user = UserPrincipal.FindByIdentity(dc, IdentityType.SamAccountName, userName);

但是,我被困在这里,我不知道如何继续登录用户。目标是在用户登录后,我将有权访问 User.Identity,包括用户所在的所有角色。本质上,应用程序的行为应该就像使用 Windows 身份验证一样,但凭据是由用户在登录页面。

您可能会问为什么不直接使用 Windows 身份验证。该应用程序将从网络外部访问,但要求使用AD认证和授权。因此我的困境。

任何建议都将受到高度赞赏。

谢谢。


经过几个小时的研究和反复试验,我最终做了以下事情:

  1. AccountController.cs- 创建应用程序用户并登录

        ApplicationUser usr = new ApplicationUser() { UserName = model.Email };
        bool auth = await UserManager.CheckPasswordAsync(usr, model.Password);
        if (auth)
                    {
                        List claims = new List();
    
    
                foreach (var group in Request.LogonUserIdentity.Groups)
                {
                    string role = new SecurityIdentifier(group.Value).Translate(typeof(NTAccount)).Value;
                    string clean = role.Substring(role.IndexOf("\\") + 1, role.Length - (role.IndexOf("\\") + 1));
                    claims.Add(new Claim(ClaimTypes.Role, clean));
                }
                claims.Add(new Claim(ClaimTypes.NameIdentifier, model.Email));
                claims.Add(new Claim(ClaimTypes.Name, model.Email));
                ClaimsIdentity ci = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
                 AuthenticationManager.SignIn(new AuthenticationProperties()
                 {
                     AllowRefresh = true,
                     IsPersistent = false,
                     ExpiresUtc = DateTime.UtcNow.AddDays(7),
                 }, ci);
                 return RedirectToLocal(returnUrl);
                }
                else
                {
                    ModelState.AddModelError("", "Invalid login credentials.");
                    return View(model);
                }
    
  2. IdentityConfig.cs(CheckPasswordAsync)- 根据 LDAP 进行身份验证

    
    
    public override async Task CheckPasswordAsync(ApplicationUser user, string password)
            {
                PrincipalContext dc = new PrincipalContext(ContextType.Domain, "domain", "DC=domain,DC=com", [user_name], [password]);
                bool authenticated = dc.ValidateCredentials(user.UserName, password);
                return authenticated;
            }
      
  3. 全局.asax- 如果您在登录表单中使用防伪令牌


AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;  

此时,您将登录并可以访问 User.Identity 对象。您还可以使用 [Authorize(Roles = "some_role"] 标记控制器和操作

事实证明,这比我想象的要容易,只是关于这个主题的真正写的不多(至少我找不到任何东西)。

此外,此代码假定您正在从有权访问网络上的域控制器的服务器运行该应用程序。如果您位于 DMZ 服务器上,则需要与网络管理员讨论此策略以获取其他选项。

我希望这能为您节省一些时间。我也很想听听社区对此的看法。也许有更好的方法来处理这种情况。如果是这样,请在这里分享。

Thanks.

丹尼尔·D.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有 LDAP 身份验证的 OWIN 的相关文章

随机推荐