未调用重写HandleUnauthorizedAsync.NET核心

niknxzdl  于 2022-11-19  发布在  .NET
关注(0)|答案(4)|浏览(117)

我已经实现了我自己的自定义认证中间件和处理程序,并在应用程序启动时配置了它们。这一切都工作得很好。
在我的自定义身份验证处理程序中,我重写了HandleAuthenticateAsync()来执行我自己的自定义身份验证,我还重写了HandleUnauthorizedAsync(),以便将用户重定向到登录页面,但没有调用它。
浏览器在响应中收到401(未授权)。我希望调用我的HandleUnauthorizedAsync()。
我对管道的理解不正确吗?
谢谢

8qgya5xd

8qgya5xd1#

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

因此,请确保在调用**UseAuthorization之前调用**UseAuthentication
在.NET7中,他们简化了它,因此可以使用以下几行代码:

builder.Services.AddAuthentication().AddJwtBearer();
builder.Services.AddAuthorization();
tkclm6bt

tkclm6bt2#

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

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

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

lzfw57am

lzfw57am3#

上面的解决方案对我来说也是有效的,我可以通过下面的代码段对其进行改进,这样就不需要在[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();
}
p5fdfcr1

p5fdfcr14#

米哈伊尔的回答为我解决了这个问题,但只是为了让它清楚:
如果您的请求命中ChallengeAsync,但未命中HandleAuthenticateAsyncAuthenticateAsync
然后检查您的订单:

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

相关问题