Authentication IdentityServer4授权因全局授权策略而失败
我已经建立了一个API,它既充当身份验证/授权服务,同时还公开了一些用于数据检索的端点 API是用IdentityServer4设置的。我可以通过客户端凭据成功检索访问令牌。但是,当我尝试使用检索到的令牌调用受保护端点时,我收到一个404 not found。日志显示该请求未经授权 我怀疑这与我添加授权策略的方式有关。它应该全局应用于所有控制器,使用我在Authentication IdentityServer4授权因全局授权策略而失败,authentication,asp.net-core,.net-core,identityserver4,asp.net-authorization,Authentication,Asp.net Core,.net Core,Identityserver4,Asp.net Authorization,我已经建立了一个API,它既充当身份验证/授权服务,同时还公开了一些用于数据检索的端点 API是用IdentityServer4设置的。我可以通过客户端凭据成功检索访问令牌。但是,当我尝试使用检索到的令牌调用受保护端点时,我收到一个404 not found。日志显示该请求未经授权 我怀疑这与我添加授权策略的方式有关。它应该全局应用于所有控制器,使用我在AddAuthentication()中应用的默认身份验证方案,如下所示: IdentityModelEventSource.ShowP
AddAuthentication()
中应用的默认身份验证方案,如下所示:
IdentityModelEventSource.ShowPII = true;
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
{
options.Authority = "http://localhost";
options.RequireHttpsMetadata = false;
options.Audience = "identityService";
}).AddMvc(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
}
...
如果删除策略,我可以毫无问题地调用有问题的端点
我做错了什么
提前感谢这里有多个问题
sub
声明。这就是为什么没有经过身份验证的用户。这解释了未经授权的错误,该错误具有HttpStatusCode 401AllowAnonymous
属性,可以从全局授权中排除方法[AllowAnonymous]
public IActionResult Error()
{
[Authorize("MyScopePolicy")]
[ApiController]
public class MyController : ControllerBase
{
对于客户端凭据流,您可能希望将筛选器更改为令牌的一部分,例如作用域:
var policy = new AuthorizationPolicyBuilder()
.RequireClaim("scope", "MyScope").Build();
尽管在混合功能(来自IdentityServer和Api)时,这可能不适合用作全局过滤器
相反,您可以配置策略并使用属性。启动时:
Services.AddAuthorization(option =>
{
option.AddPolicy("MyScopePolicy", p => p.RequireScope("MyScope"));
}
在控制器中:
[AllowAnonymous]
public IActionResult Error()
{
[Authorize("MyScopePolicy")]
[ApiController]
public class MyController : ControllerBase
{
这里有很多问题
sub
声明。这就是为什么没有经过身份验证的用户。这解释了未经授权的错误,该错误具有HttpStatusCode 401AllowAnonymous
属性,可以从全局授权中排除方法[AllowAnonymous]
public IActionResult Error()
{
[Authorize("MyScopePolicy")]
[ApiController]
public class MyController : ControllerBase
{
对于客户端凭据流,您可能希望将筛选器更改为令牌的一部分,例如作用域:
var policy = new AuthorizationPolicyBuilder()
.RequireClaim("scope", "MyScope").Build();
尽管在混合功能(来自IdentityServer和Api)时,这可能不适合用作全局过滤器
相反,您可以配置策略并使用属性。启动时:
Services.AddAuthorization(option =>
{
option.AddPolicy("MyScopePolicy", p => p.RequireScope("MyScope"));
}
在控制器中:
[AllowAnonymous]
public IActionResult Error()
{
[Authorize("MyScopePolicy")]
[ApiController]
public class MyController : ControllerBase
{
我添加了自定义策略并将其添加到控制器,但是,它仍然返回404请求是否仍然未经授权?是的,请求仍然未经授权。我是否可以在我的原始帖子中添加代码的任何特定部分供您审阅,或者您是否需要更广泛的内容?您是否验证了令牌?我使用此站点查看哪些声明可用。我解码了令牌,似乎客户端id和声明(作用域)都正确。我添加了自定义策略并将其添加到控制器,但是,它仍然返回404请求是否仍然未经授权?是的,请求仍然未经授权。我是否可以在我的原始帖子中添加代码的任何特定部分供您审阅,或者您是否需要更广泛的内容?您是否验证了令牌?我使用此站点查看哪些声明可用。我解码了令牌,似乎客户端id和声明(范围)都是正确的