通过 ISecurityTokenValidator.ValidateToken 获得的 ClaimsPrincipal 正在更改 SCP 声明的名称

ClaimsPrincipal obtained through ISecurityTokenValidator.ValidateToken is changing name of SCP claim

我目前正在使用 Azure Active Directory 访问令牌和 .NET Core 3.1。我请求的访问令牌产生以下声明:

{
...
"scp": "MyScope.Create MyScope.Search"
...
}

但是,在运行验证访问令牌后,声明的名称"scp"变为“http://schemas.microsoft.com/identity/claims/scope

SecurityToken securityToken;
ClaimsPrincipal claimsPrincipal = tokenValidator.ValidateToken(accessToken, myValidationParameters, out securityToken);
return claimsPrincipal;

此外,正如您在图片中看到的那样,并非所有声明都已更改,有些声明保持原样,如 aud 或 iss,但 scp 更改为“http://schemas.microsoft...”(就像这样是 v1 令牌,但它是 v2)

这是预料之中的事情,还是我应该配置一些东西以使声明保持原样。

谢谢!

这是预期的行为,有一个称为 InboundClaimTypeMap 的东西在途中的某个地方被调用以将它们转换为长格式以与 wsfed 等其他东西一起使用。有一种方法可以解决它

根据此线程:https://github.com/dotnet/aspnetcore/issues/4660 在最底部,他提到您可以将其放入您的启动中以防止重新映射到遗留声明

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear();

希望这能帮您解决问题,

ConfigureServices() 中也有这个选项可以设置 Startup.cs:

JwtSecurityTokenHandler.DefaultMapInboundClaims = false;

此标志会阻止映射,因此您的声明名称不会更改。