MVC4隐藏与自定义AuthorizeAttribute的链接

时间:2013-03-13 15:32:38

标签: c# entity-framework-5

我一直在挖掘一段时间,试图弄清楚如何在我的视图中使用我的自定义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;
    }

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

谢谢!

1 个答案:

答案 0 :(得分: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>
    
  6. 我无法解释它。