2012-02-28 87 views
0

我想使用新的MVC4 DbDataController公開一個寧靜的數據api。授權屬性不過濾DbDataController

我的問題是試圖確保這一點。我創建了從授權獲得屬性

public class AdminOnlyAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
    if (!IsAllowed()) { 
     filterContext.Result = new HttpUnauthorizedResult("Not logged in"); 
    } 
    ... 
} 

自定義授權屬性和在應用到我的正常控制器操作工作正常。我試圖用同樣的事情在我的數據服務是這樣的:

[AdminOnlyAttribute] 
public class DataServiceController : DbDataController<AppBuilderDataContext> 
{ 
    [AdminOnlyAttribute] 
    public IQueryable<Thing> GetThings() 
    { 
    return DbContext.AllMyThings(); 
    } 
} 

你可以看到我一直在嘗試,控制器和動作都在我的屬性,但它沒有燒製的任何一個。我在我的授權屬性函數中設置了一個斷點,並沒有被調用。

我很確定斯科特格思裏說這是行得通的。我做錯了,還是我需要一種完全不同的方法來確保這些?

回答

3

要與DataControllerApiController您的屬性派生的任何其他類型的工作,必須從System.Web.Http.AuthorizeAttribute

+0

感謝您的答覆派生。這與System.Web.Mvc.AuthorizeAttribute有很大不同。除此之外,互聯網上還沒有任何關於這一點的內容,除非是msdn對其存在的簡要承認。 我的第一個問題是,這種類型的屬性是否也適用於我的正常mvc操作?或者我需要一個重複的授權屬性類嗎? – GeekyMonkey 2012-02-28 10:11:30

+0

在測試版中,是的,你需要屬性的類型,一個用於MVC控制器,另一個用於API控制器。我們正在考慮在enxt中降低這個問題。 – marcind 2012-02-28 16:12:16

+0

我已經決定通過創建一個自定義的RoleProvider來避開這個問題,然後把它放在我的DbDataController頂部,使用AuthorizeAttribute ='System.Web.Http.AuthorizeAttribute';' 然後我可以把它放在我的數據動作或類) '[Authorize(Roles =「SuperAdmin」)]' 它沒有做我所需要的一切,但它是一個開始。在某些情況下,我需要查找用戶記錄來檢查他們是否可以訪問特定的記錄,所以這不會削減它。 如果我們有相同的MVC過濾器可以使用這些新控制器,那將會更好。 – GeekyMonkey 2012-02-28 16:48:08