好容易在繁重的開發(fā)任務(wù)之余抽出點時間學習一些東西。發(fā)現(xiàn)機子里有幾個關(guān)于 System.Security 內(nèi)容的示例,這一個命名空間以前還真是從來沒用過,正好拿來學習一下。由于不是系統(tǒng)的學習,不好組織,想了想,就以示例來說明吧。
一、設(shè)定權(quán)限
1[FileIOPermission(SecurityAction.Demand, Write= "C://temp.txt")]
2public class App : System.Windows.Forms.Form
3{
4 //略
5}
FileIOPermissionAttribute 定義于 System.Security.Permissions 里。它繼承于 SecurityAttribute,在這個例子中,要求使用 App 類時必須具有對 C:/temp.txt 文件的寫權(quán)限。
.net framework 的文檔中關(guān)于安全要求有這樣一段話:“若要確保只有被授予了指定權(quán)限的調(diào)用方才能夠調(diào)用您的代碼,可以聲明方式或強制方式要求您的代碼的調(diào)用方擁有特定的權(quán)限或權(quán)限集。要求使運行庫執(zhí)行安全檢查,從而對調(diào)用代碼實施限制。在安全檢查過程中,運行庫遍歷調(diào)用堆棧,檢查堆棧中每個調(diào)用方的權(quán)限,然后確定是否已將要求的權(quán)限授予每個調(diào)用方。如果發(fā)現(xiàn)某個調(diào)用方?jīng)]有要求的權(quán)限,則安全檢查失敗,并引發(fā) SecurityException?!?/P>
例子中,權(quán)限是以聲明的方式出現(xiàn)的。SecurityAction.Demand 可以作用于類或方法,在這里是作用于類上。Write 是 FileIOPermission 的屬性之一,其它常用屬性還有 Read、Append、All 等等。
SecurityAction 枚舉中還有一些值是作用于 assembly 上的。比如以下的例子:
[assembly:SecurityPermission(SecurityAction.RequestMinimum ,UnmanagedCode=true)]
SecurityAction.RequestMinimum 是請求運行的最小權(quán)限。這一行要求程序集允許調(diào)用非托管代碼。
除了聲明方式外,還可以使用強制方式。如下的代碼:
1FileIOPermission filePerm = new FileIOPermission(FileIOPermissionaccess.AllAccess, "C://temp.txt");
2try
3{
4 filePerm.Demand();
5
6 // Code to access file goes here
7}
8catch (SecurityException excep)
9{
10 MessageBox.Show (excep.Message);
11 return;
12}
13
二、用戶角色管理
用戶及其角色的管理是在許多程序中都要使用到的。如今 asp.net 2.0 對于這方面有了大大增強,開發(fā)人員不需要很了解技術(shù)就可以做出很不錯的應(yīng)用。不過對于 Windows Form 應(yīng)用程序來說,不少地方還需要程序員自己設(shè)定。
假定我們已知曉了 userName 以及它所屬于的 roles,那么可以這樣來設(shè)置當前線程的 PRincipal:
1GenericIdentity genIdent = new GenericIdentity(userName);
2GenericPrincipal genPrin = new GenericPrincipal(genIdent, roles);
3Thread.CurrentPrincipal = genPrin;
4
隨后我們有三種辦法來進行用戶角色驗證。
第一種方法是使用 GenericPrincipal.IsInRole 方法:
1GenericPrincipal currentPrin = Thread.CurrentPrincipal as GenericPrincipal;
2
3if (currentPrin != null && currentPrin.IsInRole("Manager"))
4{
5 //略
6}
7
第二種方法則是使用 PrincipalPermission 類,類似于權(quán)限設(shè)定中的強制方式:
1PrincipalPermission prinPerm = new PrincipalPermission(null, "Manager");
2
3try
4{
5 prinPerm.Demand();
6
7 //do something
8}
9catch
10{
11 //error handling
12}
第三種方式則類似于權(quán)限設(shè)定中的聲明方式:
1private void DecPermButton_Click(object sender, System.EventArgs e)
2{
3 try
4 {
5 performManagerAction();
6 // do something
7 }
8 catch
9 {
10 // error handling
11 }
12}
13
14[PrincipalPermission(SecurityAction.Demand, Role="Manager")]
15void performManagerAction()
16{
17}
關(guān)于安全的另一個重要內(nèi)容是加密。今天沒空寫了,改天再說。
新聞熱點
疑難解答