Проверка входа в систему пользователя AuthorizePolicy на странице Razor на Asp.Net Core
Я ищу вариант этого
@if (SignInManager.IsSignedIn(User) && User.IsInRole(Roles.Administrator))
{
<div id="editArticle">
но вместо проверки после роли я после проверки в политике так же, как вы сделали бы в контроллере, делая это.
[Authorize(Policy = Policies.RequireAdmin)]
6 ответов
Это похоже на вопрос, заданный здесь
Я нашел эту ссылку, которая может быть полезна: 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>
}
С 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>
}
Поэтому полный вид содержит:
@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>
}
Чтобы выразить это еще более кратко:
@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()
требует параметра ресурса, но нуль может быть передан как в моем примере.
Если вы собираетесь использовать это во многих представлениях, то вам лучше реализовать пользовательский 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>
}
Это выглядело бы намного более кратким.
Лучше всего с этим справляется TagHelpers в большинстве сценариев. Вы можете использовать это как:
<li policy="@MyGroups.Administrators">
....
Так что больше не Magicstrings :-)
См. Https://www.davepaquette.com/archive/2017/11/05/authorize-tag-helper.aspx