3

我已经研究了一段时间,现在试图弄清楚如何在我的视图中使用我的自定义 AuthorizeAttribute 类来显示和隐藏链接。我正在从 IsInRole 过渡到自定义 AuthorizeAttribute,因为我希望最终用户选择哪些组有权执行某些任务。到目前为止,我一直在使用:

        @{ if (HttpContext.Current.User.IsInRole("UserMgr"))
           { Html.ActionLink("Edit", "Edit", new { id = item.pkRecID }); }
        }

其中 UserMgr 是域组。(这确实有效,但不是我需要做的)

然后我创建了一个自定义 AuthorizeAttribute 类:

    public class isAuthorized : AuthorizeAttribute
{
    public string Access { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var authorized = base.AuthorizeCore(httpContext);

        string[] aszList = Access.Split(',');

        if (!authorized)
        {
            // The user is not authenticated
            return false;
        }

        var user = httpContext.User;
        if (user.IsInRole("Admin"))
            return true;

        var rd = httpContext.Request.RequestContext.RouteData;
        var id = rd.Values["id"] as string;
        if (string.IsNullOrEmpty(id))
        {
            // Now id was specified => we do not allow access
            return false;
        }

        foreach (string szGroup in aszList) // check to see if user is in group
        {
            if (user.IsInRole(szGroup))
            {
                return true;
            }
        }

        return false;
    }

这在我的控制器中可以阻止对功能的访问,但是如何使用此功能隐藏视图中的链接?

谢谢!

4

1 回答 1

3

您可以创建一个扩展方法,因此您可以将其应用于 Cshtml 文件中的 MvcHtmlStrings 示例:

public static IHtmlString If(this IHtmlString value, bool evaluation)
{
    return evaluation ? value : MvcHtmlString.Empty;
}

然后在您的 html 元素上,您可以像这样使用它:

@Html.ActionLink("Reports", "Index", "Report").If(User.IsInRole("SuperAdmin"))

更新

脚步:

  1. 在您的项目中创建一个新的静态类。

  2. 将建议的扩展方法添加到新创建的类中。

  3. 要使这个静态类在所有 cshtml 视图中可用,请转到位于 Views 文件夹中的 webconfig。

  4. 再次注意,网络配置位于视图文件夹中,请勿编辑位于应用根目录的配置。

  5. 就像下面的示例一样,添加静态类所在的命名空间。

    <system.web.webPages.razor>
      <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" /> 
        <add namespace="YourApplication.Utils"/>  <!-- THIS IS THE EXAMPLE ON HOW TO INSERT THE NAMESPACE THAT CONTAINS YOUR STATIC CLASS --> 
        <add namespace="Microsoft.Web.Helpers"/>
      </namespaces>
      </pages>
    </system.web.webPages.razor>
    

我不能更好地解释它。

于 2013-03-13T15:40:15.223 回答