2017-09-15 24 views
1

ASP.NET Core MVCで、ナビゲーションバーのリンクを非表示にしたいと思います。現在私が以前のプロジェクトで使用したMvcSiteMapProviderはASP.NET Core MVCをサポートしていません。ASP.NET Core MVCナビゲーションセキュリティのトリミング

類似したquestionが2,3年前に尋ねられ、提案された答えが動作する間に、リンクが隠されていることを確認するためにコントローラー/アクションでAuthorizationフィルターセットを繰り返す必要がありました。

これはどうやって行うことができますか、ASP.NET Core MVCのセキュリティトリミングの最新の例はありますか?

答えて

0

これを処理するカスタムタグヘルパーを作成しました。

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

これはどのhtml要素にも適用できます。あなたが唯一の特定のHTML要素に適用したい場合は、変更(<li>を言うことができます)HtmlTargetElementその後、

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

を視野に、あなたは

<li asp-roles="Admin"><a href="/Profile/Admin">Admin</a></li> 
行うことができます
関連する問題