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

Missing `aud` claim in ASP.NET core policy check prevents authorization, but it is in id token

我正在处理此处的示例应用程序: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 声明)。

我尝试了以下调试方法:

是否正在进行过滤?我用谷歌搜索了一下,什么也没看到。建议添加此行:

JwtSecurityTokenHandler.DefaultMapInboundClaims = false;

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

欢迎就如何确保授权服务检查 aud 声明提出任何建议。

所以问题是 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