16

Ich weiß in den Controllern, können Sie [Authorize("policyName")] ohne ein Problem schreiben, aber gibt es eine Möglichkeit, eine Richtlinie in einer Ansicht zu verwenden? Ich würde lieber nicht User.IsInRole(...) jedes Mal verwenden, wenn ich etwas HTML autorisieren möchte.Kann ich Autorisierungsrichtlinien in einer Ansicht in .NET Core 1.0 MVC verwenden?

Edit:

Hier einige Code

Startup.cs - Politik Erklärung

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

Admin-Controller

[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> 
+0

Ich bin verwirrt darüber, warum Sie das brauchen würden und was genau Sie meinen? Könnten Sie bitte einen Beispielcode in Ihrem Post posten? Sie könnten es einfach im Controller tun und stattdessen zu einer anderen Ansicht umleiten, wenn sie nicht in dieser Rolle waren. –

+1

Nun, in meinem Fall habe ich speziell über die Navbar gesprochen. Ich wollte einen Link [Admin] in der Navigationsleiste hinzufügen, der zu einem Admin-Controller umleitet. Der Controller selbst ist autorisiert mit einer Richtlinie, aber mein Zweck ist rein kosmetischer - nur die Registerkarte [Admin] anzuzeigen, wenn der Benutzer die Richtlinienanforderungen erfüllt, genau wie im Controller – Daath

+0

@MartinMazzaDawson Ich fügte Code zu meinem OP hinzu, wenn das hilft du bist raus. – Daath

Antwort

18

fand ich diesen Link, die hilfreich sein können: https://docs.asp.net/en/latest/security/authorization/views.html

Beispiele aus dieser Seite:

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

In einigen Fällen ist die Ressource Ihrer Ansicht nach Modell sein wird, und Sie können AuthorizeAsync genau so aufrufen, wie Sie dies während der ressourcenbasierten Autorisierung überprüfen würden.

@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

ich einen Tag Helfer zu schaffen endete, um das Element bedingt zu verbergen er zugeordnet ist.

[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(); 
    } 
} 

Nutzungs

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

Bei weitem der sauberste Ansatz vor allem - dies sollte aktualisiert werden, um die echte Antwort mit dem Fortschritt der Technologie zu werden. – user3141326

0

Dies ist eine der großen Verbesserungen in ASP Core ist, wenn Sie die Identität auf alle Seiten in der Startdatei injizieren:

@if (User.IsInRole("Admin")) 
{ 
    <p> 
    <a asp-action="Create" asp-controller="MyController">Create New</a> 
</p> 
} 

In Startup.cs :

services.AddIdentity<ApplicationUser, IdentityRole>() 

EDI T: Ok ich habe den Beitrag falsch gelesen, das wusstest du schon :) - krank lass es trotzdem wenn jemand es benutzen kann.

Verwandte Themen