2010-04-11 119 views
3

我正在使用Microsoft的成員資格和角色提供者實施基於角色的安全性。Winforms基於角色的安全限制

我有理論上的問題是,你實現這樣的方法的具體作用:

[PrincipalPermissionAttribute(SecurityAction.Demand, Role="Supervisor")] 
private void someMethod() {} 

如果在某些時候在路上,我做什麼不希望監事訪問someMethod()了嗎?

難道我不得不改變源代碼來做出改變嗎?我錯過了什麼嗎?

似乎必須有一些方法來抽象主管角色和方法之間的關係,以便我可以在應用程序中創建一種方法來更改角色權限與方法的耦合。

任何洞察力或方向將不勝感激。謝謝。

回答

5

如果您使用聲明式方法,那麼是的 - 如果您突然不希望Supervisor的成員能夠調用您的方法,則需要更改您的源代碼。

你可以,但是,也做到這一切的代碼,編程方式:

private void someMethod() 
{ 
    WindowsPrincipal currentUser = (Thread.CurrentPrincipal as WindowsPrincipal); 
    if (currentUser != null) 
    { 
     if (currentUser.IsInRole("Supervisor")) 
     { 
      // do something here 
     } 
    } 

} 

你總是可以得到您的Winforms應用程序在其下運行當前的Windows主體,然後你可以調用IsInRole方法檢查給定用戶是否在給定角色中。當然,你也可以使所有這些可配置的,例如從配置文件讀取所需的角色,如果你想讓每個人都參與進來,你只需簡單地將角色改爲Users或其他東西

5

PrincipalPermissionAttribute並不傾向於在我爲之工作的很多應用程序中使用你已經觸及的原因;該屬性應用了只能通過更改代碼才能更改的策略。可以直接使用PrincipalPermission類。在運行時,所有安全屬性都會解析爲類似命名的類和方法調用。在你的屬性的情況下,下面的代碼被執行:

PrincipalPermission permission = new PrincipalPermission(null, "Supervisor"); 
permission.Demand(); // Throws SecurityException if user is not in the role. 

如果直接使用許可類,你獲得過如何形成你的權限更多的控制。你可以有一個數據庫,你查詢獲得一個角色列表,並執行這樣的需求:

private void someMethod() 
{ 
    IEnumerable<string> roles = GetRolesForMethod("someMethod"); 

    PrincipalPermission permission = null; 

    foreach(string role in roles) 
    { 
     if(permission == null) 
     { 
      permission = new PrincipalPermission(null, role); 
     } 
     else 
     { 
      permission = permission.Union(
       new PrincipalPermission(null, role); 
       ); 
     } 
    } 

    if(permission != null) 
    { 
     permission.Demand(); 
    } 
}