IdentityServer4授权返回403禁止而不是401

bar*_*oma 2 c# asp.net-core identityserver4

我正在使用 isentittyserver4 并且我授权了我的控制器或操作。

[Authorize(Roles ="app.admin")]
[Route("products")]
public class ProductsController : Controller
{
}
Run Code Online (Sandbox Code Playgroud)

我的令牌包含角色。我可以访问User对象属性中的角色。

  • User.IsInRole("app.admin"); //错误的
  • User.IsInRole("app.viewer"); //真的

但是如果我发送带有不包含app.admin但包含的令牌的请求app.viewer

但请求响应是403禁止。但应该是401未经授权

public class Startup
{
        public void ConfigureServices(IServiceCollection services)
        {
           services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
                .AddIdentityServerAuthentication(options =>
                {
                    options.Authority = Configuration.GetValue<string>("Authority");
                    options.ApiName = Configuration.GetValue<string>("ApiName");
                    options.RequireHttpsMetadata = false;
                });

            services.AddMvc();            
        }
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseAuthentication();
            app.UseMvc();
        }
}
Run Code Online (Sandbox Code Playgroud)

Wik*_*hla 5

它应该是 403,或者至少是 401 以外的任何值。

这就是原因。

假设管道返回 401。处理程序会将请求视为未经身份验证,并将触发 SSO 流。但是,用户已经在身份提供者端进行了身份验证。然后,身份提供者将默默地返回相同/新的令牌,并且流程将返回到应用程序。根据实际返回地址,会发生以下两种情况之一:

  • 返回地址始终是应用程序的主页 - 用户会注意到他们被重定向到主页,但他们认为自己已经经过身份验证,这种情况不应该发生。您将收到有关应用程序中可能存在错误的报告。

  • 返回地址与触发 SSO 流程的地址完全相同。但我们已经讨论过如果返回 401,它会返回到身份提供者。然后,浏览器陷入IdP 和您的应用程序之间的无限重定向循环中。您将收到严重错误的报告。

如果授权返回403 而不是 401,您可以在应用程序端的管道末端捕获它(我相信一个简单的操作过滤器应该完成假设您检查 中的状态的工作OnActionExecuted)并以适当的方式处理,例如,返回由于用户缺乏所需权限而无法显示所请求资源的原因的信息。