授权属性工作异常
本文关键字:异常 工作 属性 授权 | 更新日期: 2023-09-27 18:13:54
我扩展了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
{
上面的代码用于需要admin角色的控制器。
[CustomAuthorize(RequiredRole = "User", LoginPage = "Club")]
public class HotelController : Controller
{
上面的代码用于具有User角色的控制器。有人知道为什么如果授权返回false,它允许访问吗?由于
AuthorizeCore属性的行为符合预期,它返回真或假;但是,当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);
}
}
}
}
我找到了这个特殊情况的答案,我在这里分享我的发现。
处理未经授权的请求protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
方法。在该方法中,我首先检查用户是否未经过身份验证。对于第一个请求,它可以正确地将用户发送到适当的登录页面,但是现在如果您尝试导航到需要不同角色的另一个页面,因为您已经经过身份验证,它不会进入重定向,而是允许访问控件。因此,通过在开始时删除!IsAuthenticated if,现在所有未经授权的请求都被正确地发送到正确的登录页面…