未调用来自AuthorizeAttribute的重写AuthorizeCore

时间:2012-10-25 15:07:59

标签: c# asp.net-mvc security

出于某种原因,只调用方法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)
    {

    }
}

2 个答案:

答案 0 :(得分:10)

您不应该覆盖OnAuthorization。它处理潜在的缓存问题并调用AuthorizeCore

http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/1acb241299a8#src/System.Web.Mvc/AuthorizeAttribute.cs

// 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只会是相关的。