Проверка пользователя авторизации AuthorizePolicy на странице Razor на Asp.Net Core

Я ищу вариант этого

@if (SignInManager.IsSignedIn(User) && User.IsInRole(Roles.Administrator))
{
    <div id="editArticle">

но вместо проверки после роли я после проверки в политике, как это было бы в контроллере, сделав это.

[Authorize(Policy = Policies.RequireAdmin)]

Ответ 1

Это похоже на вопрос здесь

Я нашел эту ссылку, которая может быть полезна: https://docs.asp.net/en/latest/security/authorization/views.html

Примеры с этой страницы:

@if (await AuthorizationService.AuthorizeAsync(User, "PolicyName"))
{
    <p>This paragraph is displayed because you fulfilled PolicyName.</p>
}

В некоторых случаях ресурс будет вашей моделью просмотра, и вы можете позвонить AuthorizeAsync точно так же, как вы бы авторизация на основе ресурсов;

@if (await AuthorizationService.AuthorizeAsync(User, Model, Operations.Edit))
{
    <p><a class="btn btn-default" role="button"
    href="@Url.Action("Edit", "Document", new {id= Model.Id})">Edit</a></p>
}

Ответ 2

С Dot net core 2.0 AuthorizationService.AuthorizeAsync больше не возвращает логическое значение, он возвращает AuthorizationResult. Рабочая версия для dot net core 2.0 будет выглядеть примерно так:

@using Microsoft.AspNetCore.Authorization
@inject IAuthorizationService AuthorizationService

@if ((await AuthorizationService.AuthorizeAsync(User, "RequireAuthenticatedUser")).Succeeded)
{
     <li><a asp-area="" asp-controller="Roles" asp-action="Index">Roles</a></li>
}

Ответ 3

Поэтому полный вид содержит:

@using Microsoft.AspNetCore.Authorization
@inject IAuthorizationService AuthorizationService

// Your HTML elements and i.e.:
@if (await AuthorizationService.AuthorizeAsync(User, "RequireAuthenticatedUser"))
{
     <li><a asp-area="" asp-controller="Roles" asp-action="Index">Roles</a></li>
}

Ответ 4

Чтобы сделать это еще более лаконично:

@inject Microsoft.AspNetCore.Authorization.IAuthorizationService authorizationService

@if (await authorizationService.AuthorizeAsync(User, null, "RequireAuthenticatedUser"))
{
     <li><a asp-area="" asp-controller="Roles" asp-action="Index">Roles</a></li>
}

Кажется, что AuthorizeAsync() требуется параметр ресурса, но значение null может быть передано как в моем примере.

Ответ 5

Если вы собираетесь использовать это во многих представлениях, тогда вам лучше реализовать пользовательскую RazorPage:

public abstract class MyRazorPage<T> : RazorPage<T>
{
    public async Task<bool> HasPolicyAsync(string policyName)
    {
        var authorizationService = Context.RequestServices.GetService(typeof(IAuthorizationService)) as IAuthorizationService;
        bool isAdmin = (await authorizationService.AuthorizeAsync(User, policyName)).Succeeded;
        return isAdmin;
    }
}

затем откройте _ViewImports.cshtml и добавьте следующую команду:

@inherits MyRazorPage<TModel>

теперь вы можете вызвать метод HasPolicyAsync() из любого представления:

    if (await HasPolicyAsync(Policies.RequireAdmin))
    {
        <h2>Admin is authorized</h2>
    }

Это выглядело бы намного более кратким.