2017-09-15 3 views
1

In ASP.NET Core MVC möchte ich Links in meiner Navigationsleiste ausblenden, auf die der Benutzer nicht berechtigt ist zuzugreifen. Derzeit unterstützt die MvcSiteMapProvider, die ich in früheren Projekten verwendet habe, nicht ASP.NET Core MVC.ASP.NET Core MVC Navigationssicherheit Trimmen

Eine ähnliche question wurde vor ein paar Jahren gefragt, und während die vorgeschlagene Antwort funktionieren würde, müsste der Autorisierungsfiltersatz auf einem Controller/einer Aktion wiederholt werden, um sicherzustellen, dass Links ausgeblendet sind.

Wie kann dies getan werden, und gibt es aktuelle Beispiele für die Sicherheitsanpassung in ASP.NET Core MVC?

Antwort

0

Ich habe benutzerdefinierte Tag-Helfer erstellt, um dies zu behandeln.

[HtmlTargetElement(Attributes = "asp-roles")] 
public class SecurityTrimmingTagHelper : TagHelper 
{ 
    [ViewContext] 
    public ViewContext Context { get; set; } 

    [HtmlAttributeName("asp-roles")] 
    public string Roles { get; set; } 

    /// <summary> 
    /// Hides html element if user is not in provided role. 
    /// If no role is supplied the html element will be render. 
    /// </summary> 
    /// <param name="context"></param> 
    /// <param name="output"></param> 
    public override void Process(TagHelperContext context, TagHelperOutput output) 
    {    
     if (!Context.HttpContext.User.Identity.IsAuthenticated) 
     { 
      output.SuppressOutput(); 
     } 

     if (!string.IsNullOrEmpty(Roles)) 
     { 
      var roles = Roles.Split(','); 
      foreach (var role in roles) 
      { 
       if (!Context.HttpContext.User.IsInRole(role)) 
       { 
        output.SuppressOutput(); 
        return; 
       } 
      } 
     } 
    } 
} 

Sie können dies auf jedes HTML-Element anwenden. Wenn Sie es nur bestimmte HTML-Element angewendet werden soll (lässt <li> sagen), dann die HtmlTargetElement zu

ändern
[HtmlTargetElement("li",Attributes = "asp-roles")] 

dann in Sicht können Sie tun

<li asp-roles="Admin"><a href="/Profile/Admin">Admin</a></li>