tag net mvc for asp asp.net asp.net-mvc authorization asp.net-core asp.net-core-mvc

asp.net - asp - ¿Alguna forma de usar las Políticas de Autorización en una vista en.NET Core 1.0 MVC?



razor c# (2)

Sé que en los controladores, puede escribir [Authorize("policyName")] sin problemas, pero ¿hay alguna forma de utilizar una política en una vista? Prefiero no usar User.IsInRole(...) cada vez que deseo autorizar algo de HTML.

Editar:

Aquí hay un código

Startup.cs - Declaración de política

services.AddAuthorization(options => { options.AddPolicy("testPolicy", policy => { policy.RequireAuthenticatedUser() .RequireRole("RoleOne", "RoleTwo", "RoleThree") .RequireClaim(ClaimTypes.Email); }); });

Controlador de administrador

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

Navbar HTML

<div class="navbar navbar-inverse navbar-fixed-top"> <div class="container"> <div class="navbar-collapse collapse"> <ul class="nav navbar-nav"> <li><a asp-controller="Home" asp-action="Index">Home</a></li> <!-- I want to implement my policy here. --> @if (User.IsInRole("...")) { <li><a asp-controller="Admin" asp-action="Index">Admin</a></li> } </ul> @await Html.PartialAsync("_LoginPartial") </div> </div>


Encontré este enlace que puede ser útil: https://docs.asp.net/en/latest/security/authorization/views.html

Ejemplos de esa página:

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

En algunos casos, el recurso será su modelo de vista, y puede llamar a AuthorizeAsync exactamente de la misma forma que lo haría durante la autorización basada en recursos;

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


Terminé creando un tag helper para ocultar condicionalmente el elemento al que está asociado.

[HtmlTargetElement(Attributes = "policy")] public class PolicyTagHelper : TagHelper { private readonly IAuthorizationService _authService; private readonly ClaimsPrincipal _principal; public PolicyTagHelper(IAuthorizationService authService, IHttpContextAccessor httpContextAccessor) { _authService = authService; _principal = httpContextAccessor.HttpContext.User; } public string Policy { get; set; } public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { if (!await _authService.AuthorizeAsync(_principal, Policy)) output.SuppressOutput(); } }

Uso

<li policy="testPolicy"><a asp-controller="Admin" asp-action="Index">Admin</a></li>