授权属性正常工作

时间:2015-09-22 01:15:36

标签: c# asp.net-mvc

我已将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);
            }
        }

    }

}

1 个答案:

答案 0 :(得分:1)

我找到了这种特殊情况的答案,我正在分享我的发现。当请求被正确授权时,它由

处理
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)

方法。在该方法内部,我首先检查用户是否未经过身份验证。对于第一个请求,它可以正常地将用户发送到相应的登录页面,但是现在如果您尝试导航到需要不同角色的另一个页面,因为您已经过身份验证,它将不会进入重定向并允许访问控制。所以通过删除!IsAuthenticated如果在开始时,现在所有未经授权的请求都被正确发送到正确的登录页面...