ASP.NET 核心策略检查中缺少“aud”声明会阻止授权,但它位于 id 令牌中

Posted

技术标签:

【中文标题】ASP.NET 核心策略检查中缺少“aud”声明会阻止授权,但它位于 id 令牌中【英文标题】:Missing `aud` claim in ASP.NET core policy check prevents authorization, but it is in id token 【发布时间】:2021-11-16 05:28:00 【问题描述】:

我正在处理此处的示例应用程序:https://github.com/FusionAuth/fusionauth-example-asp-netcore,并且遇到了一种情况,即声明存在于 OIDC 提供程序颁发​​的令牌中,但不适用于我正在创建的授权策略。

我正在使用 .NET core 3.1,这些是我的依赖项:

  <ItemGroup>
    <PackageReference Include="IdentityModel.AspNetCore" Version="1.0.0-rc.4.1" />
    <PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="3.1.3" />
  </ItemGroup>

现在我想检查 aud 声明,而不是像示例那样检查 applicationId: https://github.com/FusionAuth/fusionauth-example-asp-netcore/blob/master/SampleApp/Startup.cs#L35

所以添加策略的代码如下所示:

         // Configure your policies
            services.AddAuthorization(options =>
                options.AddPolicy("Registered",
                policy => policy.RequireClaim("aud", Configuration["SampleApp:ClientId"])));

但是政策失败了,我被拒绝访问安全页面。如果我将政策更改为如下所示:

         // Configure your policies
            services.AddAuthorization(options =>
                options.AddPolicy("Registered",
                policy => policy.RequireClaim("sub")));

它成功了,向我显示了受保护的页面(所以我有一个sub 声明)。

我已经尝试了以下调试:

确保 OIDC 服务器生成带有 aud 声明的 JWT(如果重要,服务器是 FusionAuth)。确实如此。 更改策略以授权任何aud 声明。我仍然无法查看安全页面。 在AddOpenIdConnect 方法(https://github.com/FusionAuth/fusionauth-example-asp-netcore/blob/master/SampleApp/Startup.cs#L47) 中向options.events 添加各种事件。我添加了OnTokenResponseReceivedOnTokenValidated 并打印出收到的令牌声明。在这两种情况下,我都看到了 aud 声明。

是否正在进行一些过滤?我用谷歌搜索了一下,没有看到任何东西。建议添加此行:

JwtSecurityTokenHandler.DefaultMapInboundClaims = false;

因为框架代码做了一些声明映射,但这似乎对我的问题没有帮助。

欢迎任何关于我可以做些什么来确保授权服务检查aud 声明的建议。

【问题讨论】:

【参考方案1】:

所以问题在于 OIDC 选项中有默认的声明操作。

https://github.com/dotnet/aspnetcore/blob/v3.1.19/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectOptions.cs 显示,对于 3.1.x:

// ...
            ClaimActions.DeleteClaim("nonce");
            ClaimActions.DeleteClaim("aud");
            ClaimActions.DeleteClaim("azp");
            ClaimActions.DeleteClaim("acr");
// more claims modification

如果您删除相关的索赔操作:

options.ClaimActions.Remove("aud");

aud 声明随后可用于策略。

有关索赔行动的更多信息:https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.authentication.oauth.claims.claimactioncollection?view=aspnetcore-3.1

【讨论】:

以上是关于ASP.NET 核心策略检查中缺少“aud”声明会阻止授权,但它位于 id 令牌中的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP .NET Core Web API 请求期间检查用户声明

无效的登录令牌。缺少必需的声明:访问 AWS Cognito AssumeRoleWithWebIdentity 时的 aud

ASP.NET Core 5 授权策略未检测到声明

动态声明 asp.net 核心身份没有数据库持久性

在 Asp.Net Core 的 Razor 页面中检查登录用户授权策略

CORS asp.net 核心 webapi - 缺少 Access-Control-Allow-Origin 标头