提供非默认架构时如何禁用默认身份验证方案

Mor*_*rse 8 c# authentication asp.net-core

我的应用程序中有两种身份验证方案

services.AddAuthentication("default")
    .AddJwtBearer("default", options =>
    {
        // some options
    })
    .AddJwtBearer("non-default", options =>
    {
        // some other options
    });
Run Code Online (Sandbox Code Playgroud)

这个想法是对大多数控制器使用默认值,并且当需要非默认值时,使用 明确提及所需的模式[Authorize(AuthenticationSchemes = "non-default")]。问题是,即使设置了非默认模式,默认模式也总是被调用。它运行并失败,然后正确的模式运行并成功。但这会导致日志中充满“无法验证令牌”消息。有没有办法禁用默认架构?

我使用 net core 2.2,但考虑迁移到 3.1。

Mor*_*rse 10

我发现解决方案不是提供默认的身份验证方法,而是提供默认的授权策略。

services.AddAuthentication()
    .AddJwtBearer("defaultScheme", options =>
    {
        // some options
    })
    .AddJwtBearer("nonDefaultScheme", options =>
    {
        // some other options
    });

services.AddAuthorization(opts =>
{
    opts.DefaultPolicy = new AuthorizationPolicyBuilder()
                                .AddAuthenticationSchemes("defaultScheme")
                                .RequireAuthenticatedUser()
                                .Build();
    opts.AddPolicy("non-default", policy => policy
                                .AddAuthenticationSchemes("nonDefaultScheme")
                                .RequireAuthenticatedUser());
});
Run Code Online (Sandbox Code Playgroud)

此后两者[Authorize][Authorize("non-default")]可以正常工作,只调用其中一种认证方案。