2014-10-09 64 views
0

我正在開發一個項目,用戶可以登錄並創建任意數量的「工作項目」,因爲它們與帳戶ID綁定在一起。我們使用OWIN和ASP.NET Identity 2.1。在ASP.NET MVC中調用控制器方法時驗證用戶權限

響應HTTP POST請求的所有MVC控制器操作都需要將WorkProjectId作爲HTTP標頭傳入。登錄的用戶應該只能與與其登錄相關的WorkProjects交互。這提出了一個重要的安全考慮:在控制器操作被調用時,可能通過使用自定義屬性來詢問WorkProjectId與當前登錄的用戶相關聯的最佳實踐?

E.g.

[EnsureUserIsAllowedToDoAnythingToThisWPID] 
public async Task UpdateWorkProjectTitle(ViewModel vm) { 
... 
} 

因爲他們認爲合適的用戶可以創建許多WorkProjects,我不認爲我可以與基於聲明的安全做到這一點。據我所知,如果WorkProjectIds以某種方式存儲爲索賠,如果它們被修改,則只要發生這種情況,就必須記錄用戶進出......這顯然是不可接受的。

因此,爲了實現我所需要的,存儲登錄用戶在會話狀態下訪問的Id是否「錯誤」?過去我在其他有會話狀態濫用的項目上被燒得非常糟糕(閱讀:太多的數據被序列化爲會話狀態),導致Web服務器癱瘓。如果有同樣簡單的方法,我寧願避免它。

謝謝

回答

1

爲什麼不只是爲當前用戶添加/刪除索賠?在控制器端通過UserManager.AddClaim通過粘貼登錄的用戶ID和期望的Claim對象(即workProject?的id)。據我所知,將用戶數據(即允許WorkProjectIds)存儲在cookie中是優選的。和您的自定義授權屬性將檢查是否要求WorkProject允許當前用戶:

[AttributeUsageAttribute(AttributeTargets.Class | AttributeTargets.Method, 
    Inherited = true, AllowMultiple = true)] 
public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    private string _url; // path to action, also you can get it from request 
    private Operations _operation; // user requested action (CRUD? or administer, execute, etc.) 

    // example of usage as attribute [CustomAuthAttrib("some string", Operations.Create)] 
    public CustomAuthorizeAttribute(string url, Operations operation) 
    { 
     _url = url; 
     _operation = operation; 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     // any httpContext.Request... operations 
     return base.AuthorizeCore(httpContext); 
    } 
} 

這裏是我的一些原始列表,我目前面臨的有點類似的問題。而且,要訪問此處的聲明,您可能需要一些擴展方法,這些擴展方法屬於OWIN/Katana和/或ASP.NET身份框架