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());
}
}
答案 0 :(得分:0)
我采用了您的代码并在 ASP.NET Core 3.1 中复制了该代码。我想你是忘记注册认证中间件了,所以只有在授权的情况下才会触发。
我复制的应用程序的行为方式与您描述的相同,但是当我将下面的行添加到 startup.cs 中时,默认身份验证方案 Auth1 中的断点在调试时开始被捕获。
app.UseAuthentication();
请记住,将它放在 UseAuthorization 之前,并记住只有 Auth1 将被调用,因为您将其设置为默认身份验证方案。