6

我一直在互聯網上試圖找出爲什麼我的自定義AuthorizeAttribute不能在我的MVC WebApi中工作。我見過的人問這種事情對SO,但沒有幫助我解決我的問題尚未:自定義AuthorizeAttribute不被MVC框架調用

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, 
       Inherited = false)] 
    public sealed class CustomAuthorization : AuthorizeAttribute 
    { 

     //... 

     protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
      // custom auth logic, returns true if authorized, false otherwise 
     } 
    } 

我從System.Web.Mvc延伸,而不是System.Web.Http。但是,我的AuthorizeCore(HttpContextBase httpContext)從未被稱爲。

我在CustomAuthorization類的構造函數,需要一個params string[]這是我的自定義權限的特定動作所需要的名字,如:

[CustomAuthorization("Some Permission")] 
[System.Web.Http.HttpGet] 
public CustomResponse SomeAction() 
{ 
    //... 
} 

我所希望實現的是有我的授權只要對使用[CustomAuthorization]屬性裝飾的動作發出請求,就會觸發代碼。如果授權失敗,我還希望能夠返回更具描述性的驗證失敗消息。不只是:

{"Message":"Authorization has been denied for this request."} 

我相信這涉及壓倒一切的HandleUnauthorizedRequest但我怎麼能這樣對我提供自己的對象,一個JSON響應會序列?

總而言之,我的授權碼永遠不會被框架調用,即使我用我的[CustomAuthorization]屬性來修飾動作。它只是直接執行操作中的代碼。

其次,我如何實現未經授權的響應來序列化自定義JSON對象?

感謝您的提前幫助,非常感謝!

+0

基於我對我如何實現自定義授權屬性的評論...對於開始,我想你想重寫OnAuthorization,而不是AuthorizeCore。另外,我不確定你需要讓你的課程密封。 – 2013-03-20 17:53:08

回答

6

好吧,我終於解決它,這是多麼:

public override void OnAuthorization(HttpActionContext actionContext) { 

    .... 

    if (!authorized) { 

     actionContext.Response =  
        actionContext.Request.CreateResponse(
            HttpStatusCode.Unauthorized, 
            new Dictionary<string, string> { 
               { "hello", "world" } 
            } 
       ); 

    } 

}

其產生的結果:

{"hello":"world"} 

Dictionary對象是任意的,它只是表明一種類型將成功序列化到Response。

如果您沒有設置actionContext.Response那麼請求將繼續執行目標操作 - 即。它被認爲是由該過濾器授權的。

希望能幫助其他人在這個位置。

+0

做得好...... – 2013-03-20 22:53:38

+0

找到這麼簡單的解決方案實在是一種解脫!感謝您的努力,非常感謝。很高興現在所有的作品! – ComethTheNerd 2013-03-21 09:13:53

相關問題