我在我的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没有工作......
答案 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文档。