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
声明)。
我尝试了以下调试方法:
- 确保 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
声明提出任何建议。
所以问题是 OIDC 选项中有默认的声明操作。
// ...
ClaimActions.DeleteClaim("nonce");
ClaimActions.DeleteClaim("aud");
ClaimActions.DeleteClaim("azp");
ClaimActions.DeleteClaim("acr");
// more claims modification
如果删除相关声明操作:
options.ClaimActions.Remove("aud");
aud
索赔随后可用于保单。
我正在处理此处的示例应用程序: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
声明提出任何建议。
所以问题是 OIDC 选项中有默认的声明操作。
// ...
ClaimActions.DeleteClaim("nonce");
ClaimActions.DeleteClaim("aud");
ClaimActions.DeleteClaim("azp");
ClaimActions.DeleteClaim("acr");
// more claims modification
如果删除相关声明操作:
options.ClaimActions.Remove("aud");
aud
索赔随后可用于保单。