在我的自定义授权属性中:
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。在我的逻辑中它应该是这样的:
首次尝试访问受保护的方法isAuthorized应为false。
用户被重定向到LogIn页面。
如果识别出用户的详细信息,则isAuthorized为true,并执行下一个语句。
可能我错过了一些东西,但如果有人能告诉我为什么总是如此,我将不胜感激。
答案 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");
}