Asp.net core ASP.NET核心MVC导航安全微调

Asp.net core ASP.NET核心MVC导航安全微调,asp.net-core,security-trimming,Asp.net Core,Security Trimming,在ASP.NET Core MVC中,我想在导航栏中隐藏用户无权访问的链接。目前,我在以前的项目中使用的不支持ASP.NET核心MVC 几年前有人问过类似的问题,虽然建议的答案可行,但需要在控制器/操作上重复设置授权过滤器,以确保链接被隐藏 如何做到这一点?在ASP.NET Core MVC中是否有任何当前的安全调整示例?我创建了自定义标记帮助程序来处理此问题 [HtmlTargetElement(Attributes = "asp-roles")] public class SecurityT

在ASP.NET Core MVC中,我想在导航栏中隐藏用户无权访问的链接。目前,我在以前的项目中使用的不支持ASP.NET核心MVC

几年前有人问过类似的问题,虽然建议的答案可行,但需要在控制器/操作上重复设置授权过滤器,以确保链接被隐藏


如何做到这一点?在ASP.NET Core MVC中是否有任何当前的安全调整示例?

我创建了自定义标记帮助程序来处理此问题

[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;
                }
            }
        }
    }
}
那么在视图中你可以做什么

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