为什么base.AuthorizeCore(httpContext);在任何认证或授权之前是真的吗?

时间:2016-02-03 09:08:08

标签: asp.net-mvc c#-4.0 authorization

在我的自定义授权属性中:

 public class AuthorizeUserAttribute : AuthorizeAttribute
{

    public string AccessLevel { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var isAuthorized = base.AuthorizeCore(httpContext);
        if (!isAuthorized)
        {
            return false;
        }

        string privilegeLevels = string.Join("", httpContext.Session["UserRole"]);
        privilegeLevels = privilegeLevels.Trim();
        AccessLevel = AccessLevel.Trim();
        string[] usersWithAcces = AccessLevel.Split(',');
        foreach (string u in usersWithAcces)
        {
            if (privilegeLevels.Equals(u))
            {
                return true;
            }
        }
        return false;
    }
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectToRouteResult(
                     new RouteValueDictionary(
                         new
                         {
                             controller = "UserAccount",
                             action = "LogIn"
                         })
                     );
    }
}

}

var isAuthorized始终为true。在我的逻辑中它应该是这样的:

  1. 首次尝试访问受保护的方法isAuthorized应为false。

  2. 用户被重定向到LogIn页面。

  3. 如果识别出用户的详细信息,则isAuthorized为true,并执行下一个语句。

  4. 可能我错过了一些东西,但如果有人能告诉我为什么总是如此,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

这就是AuthorizeCore(HttpContext)中发生的事情:

protected virtual bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (httpContext == null)
        {
            throw new ArgumentNullException("httpContext");
        }

        IPrincipal user = httpContext.User;
        if (!user.Identity.IsAuthenticated)
        {
            return false;
        }

        if (_usersSplit.Length > 0 && !_usersSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase))
        {
            return false;
        }

        if (_rolesSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole))
        {
            return false;
        }

        return true;
    }

正如您所看到的,这意味着当前用户已经登录(浏览器中有一个cookie)。假设您使用FormAuthentication,我最好的客户是您没有正确处理cookie。

尝试在隐身浏览器窗口中访问受保护资源。如果这不起作用,请查看您的LogOff控制器,它看起来应该是这样的:

public ActionResult LogOff()
{
   FormsAuthentication.SignOut();

   return RedirectToAction("Login", "Account");
}