Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Authentication IdentityServer4授权因全局授权策略而失败_Authentication_Asp.net Core_.net Core_Identityserver4_Asp.net Authorization - Fatal编程技术网

Authentication IdentityServer4授权因全局授权策略而失败

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

我已经建立了一个API,它既充当身份验证/授权服务,同时还公开了一些用于数据检索的端点

API是用IdentityServer4设置的。我可以通过客户端凭据成功检索访问令牌。但是,当我尝试使用检索到的令牌调用受保护端点时,我收到一个404 not found。日志显示该请求未经授权

我怀疑这与我添加授权策略的方式有关。它应该全局应用于所有控制器,使用我在
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 401

  • 所有方法的过滤力。当未经授权的用户访问某个方法时,这将导致HttpStatusCode 404。这意味着某些方法必须对匿名用户保持可用。通过在最低级别设置
    AllowAnonymous
    属性,可以从全局授权中排除方法

  • 例如,HomeController:

    [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 401

  • 所有方法的过滤力。当未经授权的用户访问某个方法时,这将导致HttpStatusCode 404。这意味着某些方法必须对匿名用户保持可用。通过在最低级别设置
    AllowAnonymous
    属性,可以从全局授权中排除方法

  • 例如,HomeController:

    [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和声明(范围)都是正确的