我一直在挖掘一段时间,试图弄清楚如何在我的视图中使用我的自定义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;
}
这可以在我的控制器中阻止对函数的访问,但如何使用此函数隐藏视图中的链接?
谢谢!
答案 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"))
更新
步骤:
在项目中创建一个新的静态类。
将建议的扩展方法添加到新创建的类中。
要在所有cshtml视图中使用此静态类,请转到位于Views文件夹中的webconfig。
再次注意,以便网络配置位于视图文件夹中,不要编辑应用根目录中的那个。
添加静态类所在的命名空间,如下例所示。
<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>
我无法解释它。