有没有办法如何只显示带有访问权限的链接,由
定义[Authorize(Roles = "SomeRole")]
在控制器中?
答案 0 :(得分:4)
我不相信有一个简单的解决方案,可以在不反映Controller
,获取Action
并检查AuthorizationFilters
的情况下执行此操作。
话虽如此,另一种解决方案可能是为Html.ActionLink
创建一个扩展方法重载,它接受一个角色名并检查User.IsInRole(roleName)
。仅当用户有权访问指定角色时才输出链接。
这样的事情:
public static class EntentionMethods
{
public static MvcHtmlString ActionLink(this HtmlHelper helper, string linkText, string actionName, string controllerName, string roleName)
{
if (!helper.ViewContext.RequestContext.HttpContext.User.IsInRole(roleName))
{
return MvcHtmlString.Empty;
}
return helper.ActionLink(linkText, actionName, controllerName);
}
}
不像你希望的那样漂亮,但这通常可以满足需求。
答案 1 :(得分:1)
Authorize属性应该放在您要限制访问的控制器操作(或控制器本身)上,这样您只能强制执行“somerole”角色的用户访问生成和从中生成的链接。控制器动作。您要限制访问的链接将不会显示在“授权”属性中。如果明确定义了角色和用户,它只会限制和强制角色中的用户或具有特定名称的用户访问操作。
答案 2 :(得分:1)
一种可能性是使用MvcSiteMapProvider作为菜单。它具有内置的security trimming功能,可根据AuthorizeAttribute自动隐藏链接。如果您不喜欢内置的HTML帮助程序,则可以自定义模板和/或构建自己的HTML帮助程序,以根据节点可访问性隐藏链接。
或者,如果您不想使用第三方库,则可以对AuthorizeAttributeAclModule进行反向工程以实现自己的实施。
完全披露
我是MvcSiteMapProvider的主要撰稿人。