2012-10-25 60 views
5

由於某種原因,只調用方法OnAuthorization,但不調用AuthorizeCore
這就是我把它叫做:從AuthorizeAttribute覆蓋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) 
    { 

    } 
} 

回答

-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,顯然該呼叫已丟失。我相信重寫AuthorizeCore只會在您單獨離開OnAuthorization或者您在重寫的方法內調用base.OnAuthorization(filterContext)時相關。

+0

-1你不應該重寫'OnAuthorization',你正在引入一個安全問題。看到我的答案。 – Stijn

9

你不應該覆蓋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

轉到'AuthorizeCore'的問題是你失去了'filterContext',你能不能在重寫的'OnAuthrization'的開頭調用'base.OnAuthorization(filterContext);'來確保這個緩存是一個沒問題? –