好容易在繁重的開發任務之餘抽出點時間學習一些東西。發現機子裡有幾個關於System.Security 內容的範例,這一個命名空間以前還真是從來沒用過,剛好拿來學習一下。由於不是系統的學習,不好組織,想了想,就以範例來說明。
一、設定權限
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 檔案的寫入權限。
.net framework 的文檔中關於安全要求有這樣一段話:「若要確保只有被授予了指定權限的呼叫方才能夠呼叫您的程式碼,可以聲明方式或強制方式要求您的程式碼的呼叫方擁有特定的權限或權限集。
每個呼叫
方。
SecurityAction.Demand 可以作用於類別或方法,在這裡是作用於類別上。 Write 是FileIOPermission 的屬性之一,其它常用屬性還有Read、Append、All 等等。
SecurityAction 枚舉中還有一些數值是作用於assembly 上的。例如以下的範例:
[assembly:SecurityPermission(SecurityAction.RequestMinimum ,UnmanagedCode=true)]
SecurityAction.RequestMinimum 是請求運行的最小權限。這一行要求程序集允許呼叫非託管程式碼。
除了聲明方式外,還可以使用強制方式。如下的程式碼:
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 對於這方面有了大大增強,開發人員不需要很了解技術就可以做出很不錯的應用。不過對於Windows Form 應用程式來說,不少地方還需要程式設計師自己設定。
假定我們已知曉了userName 以及它所屬於的roles,那麼可以這樣來設定當前線程的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 類,類似權限設定中的強制方式:
1PrincipalPermission prinPerm = new PrincipalPermission(null, "Manager");
2
3try
4{
5 prinPerm.Demand();
6
7 //do something
8}
9catch
10{
11 //error handling
12}
第三種方式則類似權限設定中的宣告方式:
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}
關於安全性的另一個重要內容是加密。今天沒空寫了,改天再說。