2013年4月17日 星期三

[C#] 設定程式使用權限


原來程式碼也是可以設定使用權限的~~
雖然實務上不曾用過,不過還滿有趣的。

1.
使用Windows登入腳色
2. 使用自訂使用者

一、                使用Windows登入腳色
l   在需要設定呼叫權限的Class (或方法) 加上以下Attribute
[PrincipalPermission(SecurityAction.Demand, Role = @"Administrator")]
class MyClass
{
  …
}
表示只有登入者為Administrator才有權限。

l   在主程式使用此Class時,需先宣告並設定目前識別的方法為Windows登入腳色:
//設定目前執行緒識別的方法:對應Windows登入腳色AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
try
{
  using (MyClass score = new Score())
  {  //
取出所有學生成績
  
}
}
catch (SecurityException ex)
{
  Console.WriteLine(ex.Message);
}

※若登入腳色非Administrator,則會引發SecurityException : 主要使用權限的要求失敗。
[PrincipalPermission]  Attribute只能加在 Class or Method

l   結束

二、                使用自訂使用者
l   MyClass的建構函式(或是要限制的方法)中,先加入以下程式碼判斷目前執行緒的使用腳色是否有權限:
public MyClass()
{

  
try
   
{
        //
設定主體的所需權限的群組/使用者/腳色
       
PrincipalPermission MyPermission = new PrincipalPermission ("Teacher");
        //
判斷權限是否足夠
       
MyPermission.Demand();
       
        //
Iniitial ...
   
}
    catch (Exception)
    { throw; }
  }

若目前執行緒設定的使用者/腳色非 Teacher,則會引發SecurityException : 主要使用權限的要求失敗。

l   在主程式設定目前執行緒的使用者/腳色,再宣告MyClass物件:

//Create a GenericIdentity object with no authentication type specified.
//
設定泛用無權限使用者 : ExamUser
GenericIdentity examIdentity = new GenericIdentity("DefaultUser");

//
目前使用者腳色
String[] users = new String[2] { "Teacher", "Student" };
//String[] users = new String[1] { "Student" };

//
設定泛用的主體(泛用使用者, 目前腳色)
GenericPrincipal examPrincipal = new GenericPrincipal(examIdentity, users);

//
設定目前執行緒的原則
Thread.CurrentPrincipal = examPrincipal;

try
{
     //
使用MyClass
     using (MyClass _myclass = new MyClass())
     {   //…
    
}
 }

當主程式設定的users包含Teacher,則可正常宣告及使用MyClass ,若只設定使用者為Student則會造成權限失敗。
l   結束。

沒有留言:

張貼留言