我正在尝试对服务器进行自定义身份验证。但是,即使在方法上具有[AllowAnonymous]属性,也会为每个端点调用它。使用当前的代码,即使在允许匿名函数上,我也可以每次都在HandleAuthenticateAsync方法中达到断点。
AddCustomAuthentication正确添加身份验证处理程序
public void ConfigureServices(IServiceCollection services)
{
//services.AddAuthorization();
services.AddAuthentication(options =>
{
// the scheme name has to match the value we're going to use in AuthenticationBuilder.AddScheme(...)
options.DefaultAuthenticateScheme = "scheme";
options.DefaultChallengeScheme = "scheme";
})
.AddCustomAuthentication(o => { });
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseAuthentication();
app.UseMvc();
}
...
public class CustomAuthenticationHandler : AuthenticationHandler<CustomAuthenticationOptions>
{
public RvxAuthenticationHandler(
IOptionsMonitor<RvxAuthenticationOptions> options,
ILoggerFactory logger,
UrlEncoder encoder,
ISystemClock clock) : base(options, logger, encoder, clock)
{
}
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
var token = Request.Headers["token"].ToString();
if (string.IsNullOrWhiteSpace(token))
{
return AuthenticateResult.Fail("Invalid Credentials");
}
return AuthenticateResult.Success(new AuthenticationTicket(new System.Security.Claims.ClaimsPrincipal(), "Hi"));
}
答案 0 :(得分:2)
这就是它设计的工作方式。
通过您的app.UseAuthentication()
调用添加的ASP.Net中间件对每个传入的调用执行身份验证步骤。该步骤仅为请求设置IPrincipal
的实例。
如果身份验证成功,请求将获得IPrincipal
,您将其传递给AuthenticationTicket
。
如果失败,请求将在其IIdentity
中获得未经身份验证的IPrincipal
(principal.Identity.IsAuthenticated
将为false
)
然后,该请求仍将传递给下一个中间件,并最终传递给您的终结点方法。
AuthorizeAttribute
会阻止请求到达受保护的方法,而不是任何AuthenticationHandler<T>
。
答案 1 :(得分:0)
将此添加到您的HandleAuthenticateAsync
方法的顶部
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
var endpoint = Context.GetEndpoint();
if (endpoint?.Metadata?.GetMetadata<IAllowAnonymous>() != null)
{
return Task.FromResult(AuthenticateResult.NoResult());
}
....
}
这是Microsoft在AuthorizeFiler
-https://github.com/dotnet/aspnetcore/blob/bd65275148abc9b07a3b59797a88d485341152bf/src/Mvc/Mvc.Core/src/Authorization/AuthorizeFilter.cs#L236
它将允许您在控制器中使用AllowAnonymous
属性来绕过自定义AuthenticationHandler
。