当方法具有[AllowAnonymous]时,将调用自定义AuthenticationHandler。

时间:2019-07-31 23:14:15

标签: c# asp.net-mvc

我正在尝试对服务器进行自定义身份验证。但是,即使在方法上具有[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"));
        }

2 个答案:

答案 0 :(得分:2)

这就是它设计的工作方式。

通过您的app.UseAuthentication()调用添加的ASP.Net中间件对每个传入的调用执行身份验证步骤。该步骤仅为请求设置IPrincipal的实例。

如果身份验证成功,请求将获得IPrincipal,您将其传递给AuthenticationTicket

如果失败,请求将在其IIdentity中获得未经身份验证的IPrincipalprincipal.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