【发布时间】:2015-12-18 20:12:42
【问题描述】:
我已扩展 Authorize 属性以包含来自 cookie 的角色。调试给出了很好的结果,它相应地返回真或假。但是,如果我首先使用“管理员”角色登录,然后尝试转到需要用户角色的控制器,授权返回 false,但控制器仍然允许访问。
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext == null) throw new ArgumentNullException("httpContext");
if (httpContext.User != null)
{
if (httpContext.User.Identity.IsAuthenticated)
{
if (httpContext.User.Identity is FormsIdentity)
{
FormsIdentity id = httpContext.User.Identity as FormsIdentity;
FormsAuthenticationTicket ticket = id.Ticket;
string role = ticket.UserData;
if (RequiredRole.Contains(role)) return true;
}
}
else
return false;
}
return false;
}
Requiredrole 是类的一个属性。
[CustomAuthorize(RequiredRole = "Admin", LoginPage = "Club")]
public class UsuarioAdminController : Controller
{
上面是需要管理员角色的控制器的代码。
[CustomAuthorize(RequiredRole = "User", LoginPage = "Club")]
public class HotelController : Controller
{
以上代码用于具有用户角色的控制器。 有人能明白为什么如果 Authorize 返回 false 它允许访问吗?谢谢
AuthorizeCore 属性的行为符合预期,它返回 true 或 false;但是当 AuthorizeCore 方法返回 false 时控制器允许访问。
是的,还有更多代码,但我不认为它有什么不同……就是这样。
public class CustomAuthorizeAttribute: AuthorizeAttribute
{
public string RequiredRole;
public string LoginPage;
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext == null) throw new ArgumentNullException("httpContext");
if (httpContext.User != null)
{
if (httpContext.User.Identity.IsAuthenticated)
{
if (httpContext.User.Identity is FormsIdentity)
{
FormsIdentity id = httpContext.User.Identity as FormsIdentity;
FormsAuthenticationTicket ticket = id.Ticket;
string role = ticket.UserData;
if (RequiredRole.Contains(role)) return true;
}
}
else
return false;
}
return false;
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
var routeValues = new RouteValueDictionary();
if (LoginPage == "Club")
{
routeValues["action"] = "Index";
routeValues["controller"] = LoginPage;
routeValues["ReturnUrl"] = filterContext.HttpContext.Request.RawUrl;
filterContext.Result = new RedirectToRouteResult(routeValues);
}
else {
routeValues["area"] = "mobile";
routeValues["action"] = "login";
routeValues["controller"] = LoginPage;
routeValues["ReturnUrl"] = filterContext.HttpContext.Request.RawUrl;
filterContext.Result = new RedirectToRouteResult(routeValues);
}
}
}
}
【问题讨论】:
-
设置一个断点并检查
AuthorizeCore代码中发生了什么,当它返回false时。 -
是的,我做到了。它确实返回我需要的东西,真或假。但即使它返回 false 控制器也允许访问。
-
哦,原来如此,不好意思,之前没看懂。
-
请显示您自定义
AuthorizeAttribute代码的其余部分。最有可能的是,您已经覆盖了其他导致它无法运行的东西。
标签: c# asp.net-mvc