Asp.net mvc 5 MvcSiteMapProvider未为菜单选择角色
我正在使用MVC5、windows身份验证、structuremap DI和自定义角色提供程序 MVC5的MvcSiteMapProvider未根据用户角色选择要显示的角色菜单。启用安全微调时,它仅显示未定义任何角色属性的菜单项 我已在控制器上实现并使用ActionFilterAttribute进行授权。控制器根据角色正确地将用户重定向到未经授权的页面,但菜单没有选择角色属性以隐藏菜单 自定义RoleProvider具有GetRolesForUser和GetUsersInRole的实现 任何建议都会有帮助 还想知道在SiteMapNodeModel中查找角色属性的位置。我正在考虑定制,以便在构建菜单时在HtmlHelper中查找权限 注意:相同的实现在MVC4中运行良好。一旦升级到MVC5,它就不工作了 谢谢 MVC5的MvcSiteMapProvider未根据用户角色选择要显示的角色菜单。启用安全微调时,它仅显示未定义任何角色属性的菜单项 根据,roles属性不用于MVC。它用于与ASP.NET页面的互操作 它仅在安全框架实现Asp.net mvc 5 MvcSiteMapProvider未为菜单选择角色,asp.net-mvc-5,roles,mvcsitemapprovider,Asp.net Mvc 5,Roles,Mvcsitemapprovider,我正在使用MVC5、windows身份验证、structuremap DI和自定义角色提供程序 MVC5的MvcSiteMapProvider未根据用户角色选择要显示的角色菜单。启用安全微调时,它仅显示未定义任何角色属性的菜单项 我已在控制器上实现并使用ActionFilterAttribute进行授权。控制器根据角色正确地将用户重定向到未经授权的页面,但菜单没有选择角色属性以隐藏菜单 自定义RoleProvider具有GetRolesForUser和GetUsersInRole的实现 任何建议
IPrincipal
和IIdentity
时起作用,就像成员身份和身份一样
我已在控制器上实现并使用ActionFilterAttribute进行授权。控制器根据角色正确地将用户重定向到未经授权的页面,但菜单没有选择角色属性以隐藏菜单
这很可能是你的问题。安全性调整只查找AuthorizeAttribute
和AuthorizeAttribute
的子类。如果您有子类ActionFilterAttribute
,则它不会用于隐藏导航链接
当然,要使标准的AuthorizeAttribute
起作用,您需要实现IPrincipal
和IIdentity
或使用一个预构建的安全框架来实现同样的功能
或者,您可以构建自己的IAclModule
或ISiteMapNodeVisibilityProvider(如果您有完全自定义的安全性)
还想知道在SiteMapNodeModel中查找角色属性的位置。我正在考虑定制,以便在构建菜单时在HtmlHelper中查找权限
您不需要从SiteMapNodeModel
中查找角色。相反,您应该从当前上下文中获取角色,并相应地更改/Views/Shared/DisplayTemplates/
中的菜单模板
如果您使用的框架支持IPrincipal
和IIdentity
,您可以使用:
@if (User.IsInRole("SomeRole"))
{
...
}
另见下文:
如果要获取为操作方法配置的当前角色,可以构建一个扩展方法,从当前AuthorizeAttribute
读取角色。同样,roles
属性仅用于与ASP.NET的互操作性,不应用于纯MVC,因为它意味着您无论如何都需要在AuthorizeAttribute
上复制您的角色
public static class ControllerContextExtensions
{
public static IEnumerable<string> Roles(this ControllerContext controllerContext)
{
var controllerType = controllerContext.Controller.GetType();
var controllerDescriptor = new ReflectedControllerDescriptor(controllerType);
var actionName = controllerContext.RouteData.Values["action"] as string;
var actionDescriptor = controllerDescriptor.FindAction(controllerContext, actionName);
var authorizeAttribute = FilterProviders.Providers.GetFilters(controllerContext, actionDescriptor)
.Where(f => typeof(AuthorizeAttribute).IsAssignableFrom(f.Instance.GetType()))
.Select(f => f.Instance as AuthorizeAttribute).FirstOrDefault();
string[] roles = { };
if (authorizeAttribute != null && authorizeAttribute.Roles.Length > 0)
{
roles = Array.ConvertAll(authorizeAttribute.Roles.Split(','), r => r.Trim());
}
return roles;
}
}
在控制器中:
var roles = this.ControllerContext.Roles();
要从SiteMapNodeModel
获取角色,请执行以下操作:
我正在生成如本文所述的菜单,并希望在foreach中检查@foreach(nodeList中的SiteMapNodeModel节点)的权限。我在创建菜单时考虑检查角色。我想知道如何从Mvc.sitemapXML获取角色信息。我正在循环SitemapNodeModel列表来创建菜单,但我在任何地方都看不到ROI。如果我将xml中的角色重命名为其他名称,我可以在创建菜单时在节点的attributes属性中看到它。我希望以某种方式获得用xml定义的角色列表。我在获取用户权限方面没有问题。谢谢。阅读角色的好方法。我不是在问用户角色。我问的是Mvc.sitemapXML中定义的角色。我正在创建如下菜单@foreach(节点列表中的SiteMapNodeModel节点){}
谢谢。非常有用。将尝试
var roles = this.ControllerContext.Roles();
var siteMap = MvcSiteMapProvider.SiteMaps.Current;
var siteMapNode = siteMap.FindSiteMapNodeFromKey(SiteMapNodeModel.Key);
var roles = siteMapNode.Roles;