我希望对 Blazor Server 应用程序使用 Windows 身份验证,但在使用默认身份名称时遇到了一个小问题。 即当你使用
<AuthorizeView>
Hi @context.User.Identity.Name
</AuthorizeView>
我得到了“Hi DOMAIN\A123456”,这可能是 AD 对象名称,但它不是用户会说的名称。在调试过程中,我还注意到 Identity 已经撤回了我所有的 AD 组,但没有撤回诸如 Given Name 之类的东西。
如何覆盖/修改/更改处理以“修复”此问题,最好在 Name
声明中放置一个专有名称并将 ID 移动到 NameIdentifier
声明中。
答案 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 通过一对标准登录框检查其密码。