3

鑑於下列控制器保護實體要求基於授權2的OData端點

namespace MyNamespace.Api.Controllers 
{ 
    [Authorize] 
    public class AccountController : ODataController 
    { 
     private Entities db = new Entities(); 

     // GET odata/Account 
     [Queryable] 
     [ClaimsPrincipalPermission(SecurityAction.Demand, Operation = "Read", Resource = "Account")] 
     public IQueryable<Account> GetAccount() 
     { 
      return db.Accounts(); 
     } 

     ... 

    } 

} 

我重寫ClaimsAuthorizationManager.CheckAccess(...)

public class AuthorizationManager : ClaimsAuthorizationManager 
{ 
    public override bool CheckAccess(AuthorizationContext context) 
    { 
     var resource = context.Resource.First().Value; 
     var action = context.Action.First().Value; 

     return Policies.Validate(resource, action); 
    } 
} 

這是有用的,只有到我可以檢查是否點不是Current Principal一般可以ReadAccount。但是,如果我想檢查某個用戶被允許閱讀哪些帳戶,我就會迷路。

比方說,我有一個經理用戶,他應該能夠讀取他是經理的所有賬戶,而非經理用戶應該只能讀取他們自己的賬戶。

是否有這樣的最佳做法,或者你有沒有做過這樣的事情,並給我一些提示尋找?

回答

3

我不使用ClaimsPrincipalPermissionAttribute,因爲我無法將任何動態參數傳遞給它,例如您的示例中請求的帳戶。

看一看書「臨APS.NET的Web API安全性」第97頁。他們建議通過代碼new IdentityConfiguration().ClaimsAuthorizationManager.CheckAccess(context),其中context手動構建從控制器動作實現調用AuthorizationManager這樣你就可以通過Account要求(例如)作爲Resource在您的AuthorizationManager實施中檢查它。

另請參見複合視覺培訓「.NET 4.5中的身份和訪問控制簡介」。還有一些關於如何在Web API中實現基於聲明的安全性的信息。

現在我正在實施您正在談論的安全性,我對這個主題也很感興趣。

我的情況是:角色管理員按國家分配,每個管理員只能看到與他們有權訪問的國家相關的實體。

更新:幾個項目後,我忘記了基於索賠的安全性,因爲這是進行安全檢查的極其困難的方法。今天我使用裝飾模式,所有的安全檢查都完成了。即使在這樣的OData控制器中,似乎也很容易實現安全性: public IQueriable MyQuriableEntitySet { get{ return implementationWithoutSecurity.MyQuriableEntitySet.Where(e=>e.Country.Code = currentUser.AssignedTo.CountryCode || currentUser.IsSuperAdmin); } }

+0

很棒:)更多閱讀。他們說印刷業正在走向滅亡,但我不同意。當然有Kindle,但我更喜歡印刷版。 –