Asp.net

在 .NET Core 1.0 MVC 的視圖中使用授權策略的任何方式?

  • March 17, 2016

我知道在控制器中,您可以[Authorize("policyName")]毫無問題地編寫,但是有沒有辦法在視圖中使用策略?我寧願不要User.IsInRole(...)每次我想授權一些 HTML 時都使用它。

編輯:

這是一些程式碼

Startup.cs – 政策聲明

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

管理員控制器

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

導航欄 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>

我發現此連結可能會有所幫助: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>
}

我最終創建了一個標籤助手來有條件地隱藏與之關聯的元素。

[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)) ASP.NET Core 1.x
       if (!(await _authService.AuthorizeAsync(_principal, Policy)).Succeeded)
           output.SuppressOutput();
   }
}

用法

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

引用自:https://stackoverflow.com/questions/36068655