gpt4 book ai didi

asp.net-mvc-5 - 带有 LDAP 身份验证的 OWIN

转载 作者:行者123 更新时间:2023-12-02 12:07:48 27 4
gpt4 key购买 nike

这是我的场景。我有一个使用 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. Global.asax - 如果您在登录表单中使用防伪 token

AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;

此时,您将登录并可以访问 User.Identity 对象。您还可以使用 [Authorize(Roles = "some_role"]

标记 Controller 和操作

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

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

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

谢谢。

丹尼尔·D.

关于asp.net-mvc-5 - 带有 LDAP 身份验证的 OWIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33180687/

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