5

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

    }
}
4

2 回答 2

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.

于 2013-02-21T15:12:24.147 回答
-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 才有意义。

于 2012-11-20T20:17:22.493 回答