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

时间:2018-03-29 09:13:34

标签: c# asp.net-core identityserver4

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

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

我的令牌包含角色。我可以访问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();
        }
}

1 个答案:

答案 0 :(得分:3)

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

这就是原因。

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

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

  • 返回地址是触发SSO流的完全相同的地址。但我们已经讨论过,如果这返回401,则会返回到身份提供商。然后,浏览器会在IdP和您的应用之间进行无限循环重定向。您将收到有关严重错误的报告。

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