【问题标题】:Overriden HandleUnauthorizedAsync not being called .NET Core覆盖处理未经授权的异步未调用 .NET Core
【发布时间】:2017-05-16 20:01:29
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

  • 我设法通过在我的身份验证选项中设置 AutomaticChallenge = true 来触发 HandleUnauthorizedAsync()。
  • 您能详细说明一下吗?默认情况下,自定义身份验证中间件没有 AutomaticChallenge。你是如何融入的?我是否缺少 AuthenticationSchemeOptions 以外的接口继承?

标签: .net asp.net-core unauthorized custom-authentication


【解决方案1】:

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

【讨论】:

  • 我知道已经有一段时间了,但我只需要在这里停下来说一声“祝福你”。在过去的一天里,我一直在与 ILSpy 对抗,试图了解 AuthorizationMiddleware。我的自定义令牌验证器会关闭,成功验证令牌,但是我总是会转储到 Challenge 事件中,并且 api 调用会返回 401。我现在知道,如果你使用项目模板默认值,这将是行为不假思索地进去添加 app.UseAuthentication();在适当的地方。 :)
  • 排序很重要所以确保在 UseAuthorization 之前调用 UseAuthentication。
  • 我觉得自己像个白痴,但这也解决了我的问题:D
【解决方案2】:

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

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

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

【讨论】:

  • 还有其他方法吗,比如不在控制器部分?
【解决方案3】:

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

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();
}

【讨论】:

  • 同理,app.UseAuthenication() 必须在 app.UseMvc() 之前调用
【解决方案4】:

Mihail 的回答为我解决了这个问题,但只是为了清楚:

如果您的请求到达 ChallengeAsync 但不是 HandleAuthenticateAsyncAuthenticateAsync

然后检查您的订单:

  1. app.UseAuthentication();
  2. app.UseAuthorization();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2020-02-11
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多