使用currentNode

时间:2015-07-20 10:04:10

标签: asp.net-mvc asp.net-mvc-5 mvcsitemapprovider

我在我的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.StackOverflowException' occurred in System.Web.dll,我不知道为什么。对象被填充,没有任何东西。

为什么会这样?现在我对如何让这个工作变得无能为力,因为一个简单的currentNode没有工作......

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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文档。