Как проверить политику аутентификации ASP.NET в коде, а не использовать AuthorizeAttribute? - PullRequest
2 голосов
/ 21 октября 2019

Обычный способ проверить, что политика выполняется в системе авторизации ASP.NET Core, - это настроить политику в ConfigureServices примерно так:

services.AddAuthorization(conf => {
    conf.AddPolicy("UserHasRecentPassport", policy => policy.RequireAssertion(ctx => { return ctx.User.HasRecentPassport(); }));
}

... и затем указать ее дляконтроллер или действие, использующее AuthorizeAttribute, например:

[Authorize("UserHasRecentPassport")]
public class HomeController : Controller {
    public IActionResult Index() {
        return View();
    }
}

Однако я пишу помощник по тегам, который должен проверить, соблюдается ли определенная политика. Поэтому мне нужно просто проверить это в коде, а не использовать подход AuthorizeAttribute, т.е. что-то вроде:

public override void Process(TagHelperContext context, TagHelperOutput output) {
    output.TagName = null;
    if (!policyRequirementIsMet("UserHasRecentPassport")) {
        output.SuppressOutput();
    }
}

Можно ли как-нибудь реализовать policyRequirementIsMet, чтобы он перешел к ASP.NET Core и сказал: «Скажите, соблюдается ли политика с именем X»?

1 Ответ

1 голос
/ 21 октября 2019

Используйте IAuthorizationService для выполнения обязательное разрешение . Это немного сложнее, чем показано в документации, когда используется внутри класса TagHelper, так как они не имеют прямого доступа к HttpContext и User.

Вот один из подходов, использующий *Атрибут 1011 *[ViewContext] как средство для получения HttpContext и User, и использует DI для получения IAuthorizationService:

public class PassportTagHelper : TagHelper
{
    private readonly IAuthorizationService authorizationService;

    public PassportTagHelper(IAuthorizationService authorizationService)
    {
        this.authorizationService = authorizationService;
    }

    [ViewContext]
    public ViewContext ViewContext { get; set; }

    public override async Task ProcessAsync(TagHelperContext ctx,
        TagHelperOutput output)
    {
        var httpContext = ViewContext.HttpContext;
        var authorizationResult = await authorizationService
            .AuthorizeAsync(httpContext.User, "UserHasRecentPassport");

        if (!authorizationResult.Succeeded)
            output.SuppressOutput();
    }
}

На заметку:

  • HttpContext доступен через свойство ViewContext, которое устанавливается для его украшения атрибутом [ViewContext].
  • Process изменяется на ProcessAsync, так чтомы можем использовать await.
  • Значение, возвращаемое из AuthorizeAsync, является AuthorizationResult, которое указывает на успех через его свойство Succeeded и является причиной сбоя в его Failure собственность.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...