如何使用IdentityServer 4实现Windows身份验证

The*_*eek 16 iis asp.net-core identityserver4

如何使用Identity Server 4正确实现Windows身份验证?有没有样品可以做到这一点?

我查看了IdentityServer 4的源代码,在AccountController的Host项目中,我注意到有Windows身份验证检查,它们是作为外部提供程序实现的.但我似乎无法工作配置.有没有人用idsrv4成功实现了Windows身份验证?

lea*_*ege 6

这里将会有更多文档:

https://identityserver4.readthedocs.io

但简而言之 - 是的,从IdentityServer的角度来看,Windows身份验证是一个外部提供程序(而不是IS本机身份验证cookie).

您无需执行任何操作来实现Windows身份验证 - 只需使用支持它的主机即可.

那也是

  • 红雀与IIS集成
  • WebListener

在这两种情况下,您都可以通过挑战一个Negotiate或两个方案来调用Windows机制NTLM.这不是特定于IS的 - 但是ASP.NET Core的工作方式.

我们的快速启动UI显示了如何执行此操作 - 检查AccountController.

https://github.com/IdentityServer/IdentityServer4.Quickstart.UI


Dan*_*Dan 6

对于在搜索结果中遇到此问题的任何人来说,在使用ASPNET Identity快速入门将快速入门网格化时遇到问题,以下是缺失的部分.

在大多数情况下,您希望使用ASPNET身份代码,利用SignInManager进行繁重的工作.一旦你到达那里并从快速入门添加Window auth代码,你应该到达一切看起来它正在工作的点,但你在回调中的这一行得到null:

 ExternalLoginInfo info = await _signInManager.GetExternalLoginInfoAsync();
Run Code Online (Sandbox Code Playgroud)

要将Windows视为真正的外部提供程序,而不是将"scheme"添加到第163行的auth属性,而是要将密钥更改为"LoginProvider":

properties.Items.Add("LoginProvider", AccountOptions.WindowsAuthenticationSchemeName);
Run Code Online (Sandbox Code Playgroud)

我使用域查询来提取用户的额外信息,看起来像这样:

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domain))
using (UserPrincipal up = UserPrincipal.FindByIdentity(pc, wp.Identity.Name))
{
    if (up == null)
    {
        throw new NullReferenceException($"Unable to find user: {wp.Identity.Name}");
    }

    id.AddClaim(new Claim(ClaimTypes.NameIdentifier, up.Sid.Value));
    id.AddClaim(new Claim(JwtClaimTypes.Subject, wp.Identity.Name));
    id.AddClaim(new Claim(JwtClaimTypes.Name, wp.Identity.Name));
    id.AddClaim(new Claim(JwtClaimTypes.Email, up.EmailAddress));
    id.AddClaim(new Claim(Constants.ClaimTypes.Upn, up.UserPrincipalName));
    id.AddClaim(new Claim(JwtClaimTypes.GivenName, up.GivenName));
    id.AddClaim(new Claim(JwtClaimTypes.FamilyName, up.Surname));
}
Run Code Online (Sandbox Code Playgroud)

你添加的声明取决于你,但是你需要一个类型为ClaimTypes.NameIdentifier的SigninManager来查找.SID对我来说似乎是最好用的.最后要改变的是SignInAsync调用,以便在第178-181行使用正确的方案:

await HttpContext.SignInAsync(IdentityConstants.ExternalScheme, new ClaimsPrincipal(id), properties);
Run Code Online (Sandbox Code Playgroud)

除非您覆盖IdentityServer4在.net核心2中使用的默认方案,否则这是正确的默认方案.现在,您在回调中调用GetExternalLoginInfoAsync将起作用,您可以继续!