出于某种原因,只调用方法OnAuthorization
,但AuthorizeCore
没有
这就是我所说的:
[AuthorizeWithRoles(Roles = "Affiliate")]
public string TestOnlyAffiliate()
{
return "ok";
}
这是实际属性。
public class AuthorizeWithRolesAttribute : AuthorizeAttribute
{
public string Roles { get; set; }
//
//AuthorizeCore - NOT INVOKING!
//
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
return true;
}
public void OnAuthorization(AuthorizationContext filterContext)
{
}
}
答案 0 :(得分:10)
您不应该覆盖OnAuthorization
。它处理潜在的缓存问题并调用AuthorizeCore
。
// In the worst case this could allow an authorized user
// to cause the page to be cached, then an unauthorized user would later be served the
// cached page.
将自定义逻辑放在AuthorizationCore
。
答案 1 :(得分:-1)
不确定这对你有什么帮助,但我遇到了同样的事情并确定,至少就我的目的而言,我根本不需要覆盖AuthorizeCore。说实话,我不确定为什么会这样。正如MSDN所说,OnAuthorization是在“进程请求授权时”调用的。这意味着将为具有AuthorizeWithRoles属性的任何方法调用它。您可以将自定义代码放在OnAuthorization中以检查用户是否具有权限,并且由于您可以从filterContext获取httpContext,因此实际上不需要AuthorizeCore。这是一个适合我的简单示例:
public class LoginRequired : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (Common.ValidateCurrentSession(filterContext.HttpContext))
{
//this is valid; keep going
return;
}
else
{
//this is not valid; redirect
filterContext.Result = new RedirectResult("/login");
}
}
}
我希望有所帮助。除此之外,显然你需要声明OnAuthorization是一个覆盖。
编辑:我认为基于OnAuthorization的方法是调用AuthorizeCore的方法。由于你正在重写OnAuthorization,显然这个调用已经丢失了。我相信,如果您单独使用OnAuthorization或者在重写方法中调用base.OnAuthorization(filterContext),那么重写AuthorizeCore只会是相关的。