但是,如果您想在授权策略中增加粒度,则需要在启动时创建它们:
或组成:
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ClaimsIdentity缺少JWT令牌中的范围声明?相关的知识,希望对你有一定的参考价值。
我有一个包含IdentityServer 2.5.3的ASP.Net Core应用程序,以及一个带有Swashbuckle的自定义MVC API,用于管理IdP:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<TargetLatestRuntimePatch>true</TargetLatestRuntimePatch>
<MvcRazorCompileOnPublish>true</MvcRazorCompileOnPublish>
</PropertyGroup>
<ItemGroup>
<Folder Include="wwwroot" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="IdentityServer4" Version="2.5.3" />
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.1.2" PrivateAssets="All" />
</ItemGroup>
我试图将范围策略放在控制器上以进行适当的授权,但是即使认为范围声明存在于传入的JWT令牌中,它们也始终解析为false(不匹配)。>>
例如,令牌可能看起来像这样(使用调试器捕获以检查策略代码内的请求标头):
"Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjM5NzdlOTYyN2U5NDE1MWI1M2JiYjM5YjEzMzIzOTcyIiwidHlwIjoiSldUIn0.eyJuYmYiOjE1Nzc5OTAzNDYsImV4cCI6MTU3Nzk5Mzk0NiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo5MDAwIiwiYXVkIjpbImh0dHA6Ly9sb2NhbGhvc3Q6OTAwMC9yZXNvdXJjZXMiLCJhcGkiXSwiY2xpZW50X2lkIjoic3dhZ2dlciIsInN1YiI6IjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCIsImF1dGhfdGltZSI6MTU3Nzk4ODk4MCwiaWRwIjoibG9jYWwiLCJzY29wZSI6WyJhcGkiXSwiYW1yIjpbInB3ZCJdfQ.eS8bubLllfFJdIUSc6nPl6m8hLXARDBQcu09X-p_73amQyyrjdwQHjX1nEFdXZ7pRZHk4vpy0na4_Khne5_kAh2XGMDf3RR-Vm8x6wXMPwgpNiuwdvJeVOzgwKx3gMn1I_3mnXFTJOAPIrAn3NiYnqn4qkxugDbmO1ZIWbLW9XQI0XG5C3xSmBpx7SGJ8qk5eE5TRfWcDp31YR2KGeXyCGQm_ov9SJq_z0_QShnvF7fe2vWKdETwBeo8_hNDJA7OLP5rFAwAFeA_eUWUa8e_SR-hVss5lVRQ9pZqsjQG8Bmf9Vxue28YpDni24xxxjc0vU2elaqqzWr5rz3W5FP92A"
解码后的样子:
{ "nbf": 1577990346, "exp": 1577993946, "iss": "http://localhost:9000", "aud": [ "http://localhost:9000/resources", "api" ], "client_id": "swagger", "sub": "00000000-0000-0000-0000-000000000000", "auth_time": 1577988980, "idp": "local", "scope": [ "api" ], "amr": [ "pwd" ] }
但是,在调试器中,即使存在其他范围声明,也缺少范围声明:
我的身份验证设置如下:
services .AddAuthentication(options => { options.DefaultScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme; // For API controllers options.DefaultAuthenticateScheme = "idsrv"; // For login controllers }) .AddIdentityServerAuthentication(options => { options.Authority = authorityUri; options.ApiName = $"{options.Authority}/resources"; });
任何主意是什么原因造成的?我打算使用范围将API划分为每个客户端不同的访问级别,因此这确实妨碍了我。
谢谢!
我有一个包含IdentityServer 2.5.3的ASP.Net Core应用程序,以及一个带有Swashbuckle的自定义MVC API,用于管理IdP: 但是,如果您想在授权策略中增加粒度,则需要在启动时创建它们: AND组成:ApiName
应该与您在客户端中请求的范围相匹配。options.ApiName = "api";
或组成:
services
.AddMvcCore(options =>
{
// require api1 or api2
var policy = ScopePolicy.Create("api1", "api2");
options.Filters.Add(new AuthorizeFilter(policy));
})
.AddJsonFormatters()
.AddAuthorization();
services.AddAuthorization(options =>
{
options.AddPolicy("myPolicy", builder =>
{
// require api1
builder.RequireScope("api1");
// and require api2 or api3
builder.RequireScope("api2", "api3");
});
});
Source
但是,如果您想在授权策略中增加粒度,则需要在启动时创建它们:
或组成:
以上是关于ClaimsIdentity缺少JWT令牌中的范围声明?的主要内容,如果未能解决你的问题,请参考以下文章
Azure Active Directory 令牌在 JWT 中缺少应用角色
Auth0 + Swashbuckle .Net Core 2.2。使用 SwaggerUI 时 jwt 令牌中缺少声明