MvcSitemapProvider 在使用 currentNode 时抛出溢出异常

MvcSitemapProvider throwing Overflow exception when using currentNode

我正在为我的 ASP MVC 5 项目使用 MvcSitemapProvider。

我已经实施了自定义授权来检查站点地图中的角色是否等于用户角色。

这是它的样子:

public class CustomAuthorize : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        bool authorize = false;

        var roles = SiteMaps.Current.CurrentNode.Roles;
        foreach (var role in roles)
            if (System.Web.Security.Roles.IsUserInRole(role))
                authorize = true;

        return authorize;
    }
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new HttpUnauthorizedResult();
    }
}

我的问题是,当使用 SiteMaps.Current.CurrentNode.Roles 时,它会抛出一个 An unhandled exception of type 'System.WhosebugException' occurred in System.Web.dll,我不知道为什么。对象已填充,没有任何内容是空的。

为什么会这样?现在我对如何让它工作一无所知,因为简单的 currentNode 不起作用...

我认为对当前节点的调用正在生成另一个页面请求,该页面将再次调用您的授权过滤器。换句话说,这段代码正在创建一个无限循环的调用自身 none 其中曾经 return 这就是调用堆栈溢出的原因。

我会以另一种方式存储您要检查的角色。

AuthorizeAttribute 的默认实现是您与 MvcSiteMapProvider 交互所需的全部。 AuthorizeAttribute 已经支持角色。

// Only users in the "Manager" role have access to all actions on this controller
[Authorize(Roles = "Manager")]
public class AccountController : Controller
{
    public ActionResult Manage()
    {
        return View();
    }

    public ActionResult ChangePassword()
    {
        return View();
    }
}

您唯一需要做的就是启用安全修整。请参阅 security trimming 文档。