2012-09-10 88 views
1

我正在尋找在.net中進行高級授權(不驗證)的現有解決方案。要求如下:.net中的高級授權策略

  1. 定義應用程序實體上的自定義應用程序操作。說「會議」實體的操作「更新」。
  2. 授予用戶「用戶1」僅對ID = 1的實體「會議」執行操作「更新」。
  3. 當執行操作「更新」時,檢查當前用戶(「用戶1」)是否有權訪問「 「ID爲1的實體。

所以我需要一些現有的解決方案來授權特定對象進行操作。據我所知,一些解決方案(AzMan)提供授權功能,但僅限於作爲單位的操作(不適用於具體對象)。

+0

您是否想要根據特定用戶授權特定類授權的實例? –

+0

我的意思是特定的實體。 「會議」實體描述了真實事件。我有一個關於數據庫和類中代表它在程序中的事件的記錄。 – Jekas

回答

0

你可以用PrincipalPermissionsAttribute這樣的東西來做到這一點。如果您正在處理Windows授權和諸如AzMan之類的事情,您可以簡單地創建用戶分配角色並將其登錄到您的應用程序(或使用當前登錄的用戶信息)。如果您想使用自定義身份驗證,則必須自己處理角色,並將Thread.CurrentPrincipal設置爲GenericPincipal之類的內容。然後,您可以在方法上使用PrincipalPermissionsAttribute以確保只有具有特定角色的主體並執行該方法。例如:

[PrincipalPermission(SecurityAction.Demand, Role = @"UserUpdater")] 
public void UpdateUserName(string name) 
{ 
//... 
} 

如果你想自己做的授權,一旦你授權的用戶,您可以用類似設置校長:

var identity = new GenericIdentity("Bill"); 
var roles = new[] { @"UserUpdater" }; 
var principal = new GenericPrincipal(identity, roles); 
Thread.CurrentPrincipal = principal; 

你必須處理SecurityException當沒有該角色的用戶調用該方法時。假定是別的東西檢查角色,並且根本不執行該方法...

+0

感謝您的回答。其實我看起來有點不同的解決方案。我想授權代表真正獨特實體(比如會議)的類的特定實例,而不是靜態類。 – Jekas

+0

本質上沒有什麼可做的。對象本身必須對「CurrentPrincipal」角色執行檢查。這可以通過裝飾模式和策略模式來完成,以使其與實體分離。或者,您可以使用AOP將呼叫攔截到實體中,並在將其傳遞給對象之前將其替換爲安全檢查;但是AOP在.NET中通常很棘手。 –