2016-05-29 3 views
10

Я ищу вариант этогоПроверка AuthorizePolicy пользователь Войти в Razor странице на Asp.Net Ядра

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

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

[Authorize(Policy = Policies.RequireAdmin)] 

ответ

12

Это кажется похоже на поставленный вопрос here

Я нашел эту ссылку, которая может быть полезна: 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> 
} 
+9

Это просто здорово. : D Для следующего, кто ищет это, вам нужно '@ использование Microsoft.AspNetCore.Authorization' и' @inject IAuthorizationService AuthorizationService', а также –

+0

@Thomas Спасибо за то, что вы поместили в это ответ предложение ..., MS забыл, что важный бит информации в своих документах. – JReam

+0

@JReam хе-хе, я просто хотел, чтобы люди поставили вопрос вместо комментария: P –

4

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

@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> 
} 
0

Выражаясь еще более лаконично:

@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() требует параметр ресурса, но нуль может быть передан как в моем примере.

5

С Dot net core 2.0 AuthorizationService.AuthorizeAsync больше не возвращает логическое значение, оно возвращает AuthorizationResult. Рабочая версия для точечного чистого ядра 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> 
} 
-1

Если вы собираетесь использовать это во многих взглядов, то вы бы лучше реализовать пользовательские 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> 
    } 

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

 Смежные вопросы

  • Нет связанных вопросов^_^