ClaimsIdentity缺少JWT令牌中的范围声明?

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"
  ]
}

但是,在调试器中,即使存在其他范围声明,也缺少范围声明:

enter image description here

我的身份验证设置如下:

            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:<...>[]]

在中间件中配置的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();

AND组成:

services.AddAuthorization(options => { options.AddPolicy("myPolicy", builder => { // require api1 builder.RequireScope("api1"); // and require api2 or api3 builder.RequireScope("api2", "api3"); }); });

Source

答案
您不需要为一个授权级别创建策略。

但是,如果您想在授权策略中增加粒度,则需要在启动时创建它们:

或组成:

以上是关于ClaimsIdentity缺少JWT令牌中的范围声明?的主要内容,如果未能解决你的问题,请参考以下文章

签名后更新令牌中的 jwt 范围

Azure Active Directory 令牌在 JWT 中缺少应用角色

Azure AAD 应用注册:JWT 中缺少可选声明

响应标头中缺少 jwt 授权令牌

Auth0 + Swashbuckle .Net Core 2.2。使用 SwaggerUI 时 jwt 令牌中缺少声明

是否可以在 JWT 中包含 OAuth 范围?