【问题标题】:HeaderHandler by AuthorizationHandler : No authenticationScheme was specified, and there was no DefaultChallengeScheme foundAuthorizationHandler 的 HeaderHandler :没有指定 authenticationScheme,也没有找到 DefaultChallengeScheme
【发布时间】:2020-11-26 17:15:09
【问题描述】:

我正在尝试使用 AuthorizationHandler

处理 asp.net 核心 web api 项目的标头义务

我编写了我的 Handler 和 Requirement 类:

处理程序类

public class HttpHeaderHandler : AuthorizationHandler<HttpHeaderRequirement>
    {
        private readonly IHttpContextAccessor _httpContextAccessor = null;
        private readonly ILogger<HttpHeaderHandler> _logger;

        public HttpHeaderHandler(IHttpContextAccessor httpContextAccessor, ILogger<HttpHeaderHandler> logger)
        {
            _httpContextAccessor = httpContextAccessor;
            _logger = logger;
        }

        protected override Task HandleRequirementAsync(
            AuthorizationHandlerContext context,
            HttpHeaderRequirement requirement)
        {
            if (_httpContextAccessor?.HttpContext?.Request?.Headers != null &&
                !string.IsNullOrEmpty(_httpContextAccessor.HttpContext.Request.Headers[requirement.Header]))
            {
                context.Succeed(requirement);
            }
            else
            {
                context.Fail();
                _logger.LogWarning($"Policy validation for header {requirement.Header} failed");
            }

            return Task.CompletedTask;
        }
    }

需求类

public class HttpHeaderRequirement : IAuthorizationRequirement
    {
        public HttpHeaderRequirement(string header)
        {
            Header = header;
        }

        public string Header { get; }
    }

所以我将它添加到 ConfigurationServices 方法中:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();

            services.AddMvc();
            services.AddAuthorization(options =>
            {
                options.AddPolicy("HttpHeaderRequirement",
                                  policy => policy.Requirements.Add(new SRN.Microservice.Commons.Authorization.HttpHeaderRequirement("Auth_Token")));
            });
        }

所以我使用实现的授权创建了我的控制器类:

[Produces("application/json")]
    [Route("api/[controller]")]
    [ApiController]
    [Authorize(Policy = "HttpHeaderRequirement")]
    public class MyController : ControllerBase
    {
       [....]
    }

当我尝试调用我的 API 时,服务器返回以下异常:

System.InvalidOperationException: No authenticationScheme was specified, and there was no DefaultChallengeScheme found. The default schemes can be set using either AddAuthentication(string defaultScheme) or AddAuthentication(Action<AuthenticationOptions> configureOptions).
   at Microsoft.AspNetCore.Authentication.AuthenticationService.ChallengeAsync(HttpContext context, String scheme, AuthenticationProperties properties)
   at Microsoft.AspNetCore.Authorization.Policy.AuthorizationMiddlewareResultHandler.HandleAsync(RequestDelegate next, HttpContext context, AuthorizationPolicy policy, PolicyAuthorizationResult authorizeResult)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

有人可以帮助我吗?

【问题讨论】:

  • 不确定您的身份验证方案是什么,只需添加如下代码:services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie();

标签: c# asp.net-core .net-core asp.net-core-webapi


【解决方案1】:

如果您对经过身份验证的用户不感兴趣,我认为在这种情况下您可能误用了授权系统。

授权旨在说明“如果您需要授权,您将面临提供身份验证详细信息的挑战”,之后它可以运行处理程序。在您的情况下,您没有配置任何身份验证(因为您实际上并没有检查登录的用户?)。

就您而言,您希望发生什么?如果您只是想返回错误页面,您可以编写自己的与内置授权无关的属性,并根据您现有的逻辑在操作上运行以返回错误页面。

如果您希望缺少的标头确实需要身份验证,那么您将需要添加和配置身份验证。

编辑

有关操作过滤器的详细信息,请参阅https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-5.0#action-filters

【讨论】:

    猜你喜欢
    • 2019-11-02
    • 1970-01-01
    • 2018-02-26
    • 2021-10-18
    • 2019-03-22
    • 2019-08-02
    • 2021-05-24
    • 1970-01-01
    • 2021-10-11
    相关资源
    最近更新 更多