我已将Authorize属性扩展为包含来自cookie的角色。调试给出了良好的结果,它相应地返回true或false。但是,如果我首先使用“Admin”角色登录,然后尝试转到需要User角色的控制器,则Authorize返回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);
}
}
}
}
答案 0 :(得分:1)
我找到了这种特殊情况的答案,我正在分享我的发现。当请求被正确授权时,它由
处理protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
方法。在该方法内部,我首先检查用户是否未经过身份验证。对于第一个请求,它可以正常地将用户发送到相应的登录页面,但是现在如果您尝试导航到需要不同角色的另一个页面,因为您已经过身份验证,它将不会进入重定向并允许访问控制。所以通过删除!IsAuthenticated如果在开始时,现在所有未经授权的请求都被正确发送到正确的登录页面...