覆盖 ASP.NET Core Windows 身份验证标识

时间:2021-06-25 14:53:32

标签: asp.net-core authentication active-directory blazor windows-identity

我希望对 Blazor Server 应用程序使用 Windows 身份验证,但在使用默认身份名称时遇到了一个小问题。 即当你使用

<AuthorizeView>
   Hi @context.User.Identity.Name
</AuthorizeView>

我得到了“Hi DOMAIN\A123456”,这可能是 AD 对象名称,但它不是用户会说的名称。在调试过程中,我还注意到 Identity 已经撤回了我所有的 AD 组,但没有撤回诸如 Given Name 之类的东西。

如何覆盖/修改/更改处理以“修复”此问题,最好在 Name 声明中放置一个专有名称并将 ID 移动到 NameIdentifier 声明中。

1 个答案:

答案 0 :(得分:0)

这就是我想出的使用 IClaimsTransformation 的方法,但不确定它是否是正确的方法,尤其是在开箱即用的 Blazor 项目中,这个东西被调用了 7 次!如果我添加了任何 db 类型的逻辑来获取角色或名称,那么这就是坦克性能...

public class RoleClaimsTransformer : IClaimsTransformation
{
    private readonly ILogger<RoleClaimsTransformer> _logger;

    public RoleClaimsTransformer(ILogger<RoleClaimsTransformer> logger)
    {
        _logger = logger;
    }

    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        _logger.LogDebug($"Role Transform for {principal.Identity.Name} Auth: {principal.Identity.IsAuthenticated}");

        //get the original name claim
        var ci = (ClaimsIdentity)principal.Identity;
        Claim nameClaim = principal.FindFirst(ci.NameClaimType);

        //create a new principal
        ClaimsPrincipal newCP = new ClaimsPrincipal();
        //and a new identity, using the original authtype (just in case it matters down the line)
        var newId = new GenericIdentity("Joe Bloggs", principal.Identity.AuthenticationType);
        //add the original name as a NameId
        newId.AddClaim(new Claim(ClaimTypes.NameIdentifier, nameClaim.Value));
        //add roles etc
        newId.AddClaim(new Claim(ClaimTypes.Role, "admin"));

        newCP.AddIdentity(newId);

        return Task.FromResult(newCP);
    }
}

希望我所做的事情相当清楚,但基本上忽略了内置 Windows Auth 中的主体并创建自己的。另请注意,GenericIdentity 确实需要用于角色的 ClaimTypes.Role(用于 AuthorizeView 组件),而不是 WindowsIdentity 所需的任何类型。

我随后意识到 WindowsAuthentication 不适用于我的应用程序,我将返回自定义身份验证,该身份验证仅使用 AD 通过一对标准登录框检查其密码。