12

我已经实现了自己的自定义身份验证中间件和处理程序,并在应用启动时对其进行了配置。这一切都很好。

在我已经覆盖 HandleAuthenticateAsync() 以执行我自己的自定义身份验证的自定义身份验证处理程序中,我还覆盖了 HandleUnauthorizedAsync() 以将用户重定向到登录页面,但这没有被调用。

浏览器在响应中收到 401(未授权)。我期待我的 HandleUnauthorizedAsync() 被调用。

我在这里没有正确理解管道吗?

谢谢

4

4 回答 4

13

user1859022 对我的情况有所帮助,但我不想为每个[Authorize]. 并且指定DefaultAuthenticateScheme一开始也不起作用。

我的错误有点愚蠢。我两者都有app.UseAuthorization()app.UseAuthentication()当然顺序是错误的。正确的版本是

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
        app.UseDeveloperExceptionPage();

        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints => endpoints.MapControllers());
}

所以请确保在之前UseAuthentication调用 UseAuthorization

于 2020-04-01T09:36:23.463 回答
12

在我的情况下,我的处理程序没有被调用的原因是我没有被AuthenticationScheme选为默认值。我必须将它包含在我的Authorize属性中,如下所示:

[HttpGet]
[Authorize(AuthenticationSchemes= "MyAuth")]
public IEnumerable<string> Get()
{
    ...
}

顺便说一句:该AutomaticChallenge选项似乎已被删除.net core 2.0

于 2018-04-12T14:57:27.857 回答
5

上述解决方案对我也有效,我可以通过以下代码段对其进行改进,因此无需在[Authorize]属性中指定身份验证方案名称。之前调用该AddAuthentication方法很重要AddMvc

public void ConfigureServices(IServiceCollection services)
{
    //must be placed before the AddMvc call
    services.AddAuthentication(options => 
                {                    
                    options.DefaultAuthenticateScheme = "MyAuth";
                    options.DefaultChallengeScheme = "MyAuth";
                })
                .AddCustomAuth(o => { });
    
    services.AddMvc();
}
于 2018-06-06T17:10:58.207 回答
1

米哈伊尔的回答为我解决了这个问题,但只是为了清楚:

如果你的请求是命中ChallengeAsyncHandleAuthenticateAsync不是AuthenticateAsync

然后检查您的订购:

  1. app.UseAuthentication();
  2. app.UseAuthorization();
于 2021-01-18T18:21:25.720 回答