2012-02-28 124 views
14

我試圖在Web API控制器上實現自定義授權屬性,但遇到了意外的行爲。ASP.NET Web API的自定義MVC AuthorizeAttribute

 <Authorize(Users:="myUser")> 
    Public Function GetTodoItems() As IQueryable(Of TodoItem) 

上面的代碼工作得非常好:它將使「MYUSER」檢索項目,BOT沒有其他人被允許訪問。但是,當我使用我的自定義授權嘗試相同的方法時,整個檢查將被跳過,並且任何用戶都可以訪問資源。我的派生類中的AuthorizeCoreOnAuthorization重寫的方法都沒有被調用。

 <MyAuth(Users:="myUser")> 
    Public Function GetTodoItems() As IQueryable(Of TodoItem) 

的派生類System.Web.Mvc.AuthorizeAttribute繼承,並且該項目在IIS上部署,與Windows身份驗證 & 模擬啓用匿名身份驗證禁用。

如果我將相同的自定義授權添加到MVC控制器,那麼它的工作原理。但在API控制器上,什麼都沒有。如果Authorize屬性也不起作用,它會更有意義。我錯過了什麼嗎?這是預期的行爲還是Beta版中的錯誤?

回答

31

您應該使用System.Web.Http.dll中的System.Web.Http.AuthorizeAttribute來獲取Web API,而不是System.Web.Mvc.AuthorizeAttribute

也就是說,因爲namespace System.Web.Http.AuthorizeAttribute來自AuthorizationFilterAttribute。過濾器由Web API自動處理。在我自己的實現中,我直接從AuthorizationFilterAttribute派生出來用於處理基本的HTTP身份驗證。

+0

謝謝,改變命名空間的工作!使用'System.Web.Mvc.AuthorizeAttribute'工作在Web API上似乎很奇怪,而我的類從那個確切的類派生出來,卻沒有。 – 2012-02-28 16:04:09

+1

似乎很多類型在MVC和Web API之間重複。也許他們會被合併,我們將在發佈中獲得單一樣本類型。所以,可能任何一個'AuthorizeAttibute'對象都在內部檢查,只是猜測。 – 2012-02-28 16:08:06