dotnet 核心多重身份验证方案:未触发身份验证处理程序

时间:2021-03-29 15:56:41

标签: authentication .net-core

Dotnet 核心 3.1。我有两个自定义身份验证方案和处理程序。当控制器操作具有 [Authorize] 属性时,两个处理程序都会被触发。如果没有 [Authorize] 属性,则只会触发默认方案。我不能将 Authorize 属性放在控制器操作上,但仍然需要获得由第二个 Auth 方案设置的声明。如何确保不仅触发默认身份验证处理程序?

这是我的简化 setup.cs:

    services
        .AddAuthentication("Auth1")
        .AddScheme<AuthenticationSchemeOptions, Auth1>("Auth1", null)
        .AddScheme<AuthenticationSchemeOptions, Auth2>("Auth2", null);

    services
        .AddAuthorization(options =>
        {
            options.DefaultPolicy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .AddAuthenticationSchemes("Auth1", "Auth2")
                .Build();
        });

Auth1 和 Auth2 处理程序是这样的(也只是为了演示):

public class Auth1 : AuthenticationHandler<AuthenticationSchemeOptions>
{ 
    ....
    protected override Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        return Task.FromResult(AuthenticateResult.NoResult());
    }
}

public class Auth2 : AuthenticationHandler<AuthenticationSchemeOptions>
{ 
    ....
    protected override Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        return Task.FromResult(AuthenticateResult.NoResult());
    }
}

1 个答案:

答案 0 :(得分:0)

我采用了您的代码并在 ASP.NET Core 3.1 中复制了该代码。我想你是忘记注册认证中间件了,所以只有在授权的情况下才会触发。

我复制的应用程序的行为方式与您描述的相同,但是当我将下面的行添加到 startup.cs 中时,默认身份验证方案 Auth1 中的断点在调试时开始被捕获。

app.UseAuthentication();

请记住,将它放在 UseAuthorization 之前,并记住只有 Auth1 将被调用,因为您将其设置为默认身份验证方案。