未调用来自AuthorizeAttribute的重写AuthorizeCore

Sex*_*yMF 5 c# security asp.net-mvc

出于某种原因,只OnAuthorization调用了方法,但AuthorizeCore没有.
这就是我所说的:

[AuthorizeWithRoles(Roles = "Affiliate")]
public string TestOnlyAffiliate()
{
     return "ok";
}
Run Code Online (Sandbox Code Playgroud)

这是实际属性.

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)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

use*_*702 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.
Run Code Online (Sandbox Code Playgroud)

把你的自定义逻辑放入AuthorizationCore.


GWt*_*dev -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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助。除此之外,显然您需要声明 OnAuthorization 是一个覆盖。

编辑:我相信基本的 OnAuthorization 方法是调用 AuthorizeCore 的方法。由于您要覆盖 OnAuthorization,显然该调用会丢失。我相信只有当您单独保留 OnAuthorization 或在重写方法中调用 base.OnAuthorization(filterContext) 时,重写 AuthorizeCore 才有意义。