Пользовательская политика для авторизации - PullRequest
1 голос
/ 26 апреля 2019

Я работаю над требованием, в котором я проверяю, содержит ли наш заголовок запроса заголовок авторизации и на основании этого либо вызывает другой сервер и возвращает 403. В настоящее время я сделал это, создав пользовательский атрибут ActionAttribute следующим образом:

 public class ValidateAuthHeaderAttribute: ActionFilterAttribute
{
    private readonly ILogger<ValidateAuthHeaderAttribute> _logger;
    public ValidateAuthHeaderAttribute(ILogger<ValidateAuthHeaderAttribute> logger)
    {
        _logger = logger;
    }
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var httpContext = context.HttpContext;

        if (httpContext.Request.Headers.ContainsKey("Authorization"))
        {
            return;
        }
        var failureResponse = new FailureResponseModel
        {
            Result = false,
            ResultDetails = "Authorization header not present in request",
            Uri = httpContext.Request.Path.ToUriComponent(),
            Timestamp = DateTime.Now.ToString("s", CultureInfo.InvariantCulture),
            Error = new Error
            {
                Code = 108,
                Description = "Authorization header not present in request",
                Resolve = "Send Request with authorization header to avoid this error."
            }
        };

        var responseString = JsonConvert.SerializeObject(failureResponse);

        context.Result = new ContentResult
        {
            Content = responseString,
            ContentType = "application/json",
            StatusCode = 403
        };
    }
}

И я использую этот пользовательский атрибут в моем контроллере / методах, подобных этому.

[TypeFilter(typeof(ValidateAuthHeaderAttribute))]

Теперь это работает нормально, но я читал об авторизации на основе политик в .Net Core doc . Так как сейчас рекомендуется использовать Политики. Я думал, что можно перенести мой код в пользовательскую политику.

1 Ответ

2 голосов
/ 29 апреля 2019

IMO, я бы посоветовал вам продолжать использовать ValidateAuthHeaderAttribute, что намного проще.

Если вы настаиваете на политике, выполните следующие действия:

  1. Требование

    public class AuthorizationHeaderRequirement: IAuthorizationRequirement
    {
    }
    public class AuthorizationHeaderHandler : AuthorizationHandler<AuthorizationHeaderRequirement>
    {
        protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, AuthorizationHeaderRequirement requirement)
        {
            // Requires the following import:
            //     using Microsoft.AspNetCore.Mvc.Filters;
            if (context.Resource is AuthorizationFilterContext mvcContext)
            {
                // Examine MVC-specific things like routing data.
                var httpContext = mvcContext.HttpContext;
    
                if (httpContext.Request.Headers.ContainsKey("Authorization"))
                {
                    context.Succeed(requirement);
                    return;
                }
                var failureResponse = new FailureResponseModel
                {
                    Result = false,
                    ResultDetails = "Authorization header not present in request",
                    Uri = httpContext.Request.Path.ToUriComponent(),
                    Timestamp = DateTime.Now.ToString("s", CultureInfo.InvariantCulture),
                    Error = new Error
                    {
                        Code = 108,
                        Description = "Authorization header not present in request",
                        Resolve = "Send Request with authorization header to avoid this error."
                    }
                };
    
                var responseString = JsonConvert.SerializeObject(failureResponse);
                mvcContext.Result = new ContentResult
                {
                    Content = responseString,
                    ContentType = "application/json",
                    StatusCode = 403
                };
    
                await mvcContext.Result.ExecuteResultAsync(mvcContext);
            }
            return;
        }
    }
    
  2. Настроить в Startup.cs

    services.AddAuthorization(options =>
    {
        options.AddPolicy("AuthorizationHeaderRequirement", policy =>
            policy.Requirements.Add(new AuthorizationHeaderRequirement()));
    });
    
    services.AddSingleton<IAuthorizationHandler, AuthorizationHeaderHandler>();
    
  3. Контроллер

    [Authorize(Policy = "AuthorizationHeaderRequirement")]
    public IActionResult Privacy()
    {
        return View();
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...