我正在尝试对服务器进行自己的自定义身份验证。但是,即使在方法上具有[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"));
}
最佳答案
这就是它设计的工作方式。
验证步骤由app.UseAuthentication()
调用添加的ASP.Net中间件为每个传入呼叫执行。该步骤仅为请求设置IPrincipal
实例。
如果身份验证成功,则请求将获取您传递给IPrincipal
的AuthenticationTicket
。
如果失败,请求将在其IIdentity
中获得未经身份验证的IPrincipal
(principal.Identity.IsAuthenticated
将为false
)
然后,该请求仍将传递给下一个中间件,并最终传递给您的终结点方法。
是AuthorizeAttribute
阻止请求到达受保护的方法,而不是任何AuthenticationHandler<T>
。