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
添加各种事件。我添加了OnTokenResponseReceived
和OnTokenValidated
并打印出收到的令牌声明。在这两种情况下,我都看到了 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