Asp.net core 基于声明的授权找不到用户实际拥有的声明

Asp.net core 基于声明的授权找不到用户实际拥有的声明,asp.net-core,asp.net-web-api,asp.net-identity,Asp.net Core,Asp.net Web Api,Asp.net Identity,TL;DR:AuthorizationPolicyBuilder.Requirecreal似乎仅在将策略应用于ApiController时适用于JWT索赔,我需要检查用户的索赔 我第一次采用索赔授权,所以这可能是我的错误。让我先介绍一下上下文: 我有一个ASP.NET解决方案,它有一堆我需要保护的API 我在解决方案中添加了标识,因此我可以注册并登录内部用户(顺便说一句,我没有使用外部提供商) 我已将解决方案设置为使用IdentityServer4对API执行OIDC身份验证 API可通过外

TL;DR
AuthorizationPolicyBuilder.Requirecreal
似乎仅在将策略应用于ApiController时适用于JWT索赔,我需要检查用户的索赔


我第一次采用索赔授权,所以这可能是我的错误。让我先介绍一下上下文:

  • 我有一个ASP.NET解决方案,它有一堆我需要保护的API
  • 我在解决方案中添加了标识,因此我可以注册并登录内部用户(顺便说一句,我没有使用外部提供商)
  • 我已将解决方案设置为使用IdentityServer4对API执行OIDC身份验证
  • API可通过外部SPA(react)应用程序访问
到目前为止,还不错——我可以要求用户通过IS4进行身份验证,这样我就可以调用API了。不过,我还有一个要求。对于某些API,我需要我的用户也有一个特定的声明

我已经建立了一个策略来检查这一点,它是这样的:

//索赔
公共静态类索赔
{
公共静态只读声明MyClaim=new(“Foo”、“Bar”);
}
//政策
公共静态只读授权策略MyPolicy=new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()文件
.Requirecall(Claims.MyClaim.Type,Claims.MyClaim.Value)
.Build();
//启动
服务
.AddAuthorization(选项=>
{
options.AddPolicy(nameof(Policies.MyPolicy)、Policies.MyPolicy);
});
//控制器
[ApiController]
[授权(Policy=nameof(Policies.MyPolicy))]
公共类MyController:控制器{}
当访问MyController的任何操作时,我得到一个403错误(如果用户登录,否则,我得到一个401)

除了创建静态类来保存策略和声明之外,我正在做的事情似乎与MSFT自己的示例没有什么不同(事实上,我有一个使用策略的剃须刀页面,我已经用同样的方法设置了一个不同的声明,它正在工作)


我的怀疑

为了测试发生了什么,我用
RequireAssertion
替换了上面的
RequireAssertion
,它使用
context.User.HasClaim
来检查所需的声明。真正未经核实的声明;我目前的印象是,该策略只关注属于JWT一部分的声明——我通过查看我正在传递API的JWT来检查这一点。但是,用户确实有声明-我有一个Razor页面,它呈现一个包含所有
PageModel.user.Claims
的表,我正在寻找的(本例中为Foo-Bar)就在那里。当然,这是个轶事——可能是RequireRecall和RequireAssert在索赔方面的工作方式不同,但仍然


有什么建议吗?

我觉得自己很愚蠢。。。当然,这是一种不同的行为,当然,应用程序只关注JWT中的claism,这就是它应该的样子。我必须在IS4中配置应用程序,以便它将发出具有所需声明的JWT:(