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