gpt4 book ai didi

c# - JwtToken - 声明名称 JwtTokenTypes.Subject 解析为 ClaimTypes.NameIdentifier,这是为什么以及如何防止?

转载 作者:行者123 更新时间:2023-12-04 00:30:18 24 4
gpt4 key购买 nike

我有这样创建的 JwtToken:

        X509Certificate2 cert = certificateStore.Certificate;

var now = DateTime.UtcNow;
var tokenHandler = new JwtSecurityTokenHandler();
var tokenDescriptor = new SecurityTokenDescriptor()
{
Subject = new ClaimsIdentity(new[]
{
new Claim(JwtClaimTypes.Subject, upn),
new Claim(REQUEST_TYPE_NAME, requestType),
new Claim(DOMAIN_NAME, domain),
}),
Lifetime = new Lifetime(now, now.AddMinutes(60)),
SigningCredentials = new X509SigningCredentials(cert),
TokenIssuerName = ISSUER
};

SecurityToken token = tokenHandler.CreateToken(tokenDescriptor);

这是正确的。 token 已创建,其第一个声明名为“sub”,这是 JwtTokenTypes.Subject 的内容。我通过jwt web查过了.

问题是,我有这种解决 claim 的方法:

        if (string.IsNullOrWhiteSpace(token)) throw new MissingTokenException("Token should not be null.");

var tokenHandler = new JwtSecurityTokenHandler();
var securityToken = new X509SecurityToken(new X509Certificate2(new X509RawDataKeyIdentifierClause(certificateStore.Certificate).GetX509RawData()));
var validationParameters = new TokenValidationParameters()
{
IssuerSigningToken = securityToken,
ValidateAudience = false,
ValidateActor = false,
ValidIssuer = ISSUER
};

SecurityToken securedToken = new JwtSecurityToken();
ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(token, validationParameters, out securedToken);

Claim claim = claimsPrincipal.FindFirst(m => string.Equals(m.Type, REQUEST_TYPE_NAME, StringComparison.OrdinalIgnoreCase));
if (claim != null && !string.Equals(claim.Value, requestType, StringComparison.OrdinalIgnoreCase))
{
throw new MismatchedTokenException("Token is not of the proper type.");
}

upn = claimsPrincipal.Claims.FirstOrDefault(m => m.Type.Equals(JwtClaimTypes.Subject) || m.Type.Equals(ClaimTypes.NameIdentifier))?.Value;

domain = claimsPrincipal.Claims.FirstOrDefault(m => m.Type.Equals(DOMAIN_NAME))?.Value;

在该方法的末尾,您可以看到我检查了 JwtClaimTypes.Subject 的声明名称,它应该是,以及 ClaimTypes.NameIdentifiew,它实际上是。

您知道为什么会发生这种转变或如何防止这种转变吗?

最佳答案

之前需要添加:

JwtSecurityTokenHandler.InboundClaimTypeMap.Clear();

这清除了 jwt 声明的映射。

完成映射是为了使 jwt 声明适应 .net 类型的声明。如果您避免映射,如果您想从身份(IPrincipal.IsInRole 或 Identity.Name)中使用名称和角色,则需要设置声明类型。

您可以在创建 ClaimsIdentity 时执行此操作:

    Subject = new ClaimsIdentity(new[]
{
new Claim(JwtClaimTypes.Subject, upn),
new Claim(REQUEST_TYPE_NAME, requestType),
new Claim(DOMAIN_NAME, domain),
}, "<auth type>", "name", "role"),

您必须将 authType 更改为类似 cookie 的内容,名称和角色声明名称很可能就是这样。

另一种方法是在 token 验证参数上设置它:

var validationParameters = new TokenValidationParameters()
{
IssuerSigningToken = securityToken,
ValidateAudience = false,
ValidateActor = false,
ValidIssuer = ISSUER,
NameClaimType = "name",
RoleClaimType = "role"
};

关于c# - JwtToken - 声明名称 JwtTokenTypes.Subject 解析为 ClaimTypes.NameIdentifier,这是为什么以及如何防止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39141310/

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