Asp.net mvc 5 MvcSiteMapProvider未为菜单选择角色

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的实现 任何建议

我正在使用MVC5、windows身份验证、structuremap DI和自定义角色提供程序

MVC5的MvcSiteMapProvider未根据用户角色选择要显示的角色菜单。启用安全微调时,它仅显示未定义任何角色属性的菜单项

我已在控制器上实现并使用ActionFilterAttribute进行授权。控制器根据角色正确地将用户重定向到未经授权的页面,但菜单没有选择角色属性以隐藏菜单

自定义RoleProvider具有GetRolesForUser和GetUsersInRole的实现

任何建议都会有帮助

还想知道在SiteMapNodeModel中查找角色属性的位置。我正在考虑定制,以便在构建菜单时在HtmlHelper中查找权限

注意:相同的实现在MVC4中运行良好。一旦升级到MVC5,它就不工作了

谢谢

MVC5的MvcSiteMapProvider未根据用户角色选择要显示的角色菜单。启用安全微调时,它仅显示未定义任何角色属性的菜单项

根据,roles属性不用于MVC。它用于与ASP.NET页面的互操作

它仅在安全框架实现
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;