通过 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;
此标志会阻止映射,因此您的声明名称不会更改。
我目前正在使用 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;
此标志会阻止映射,因此您的声明名称不会更改。