原來程式碼也是可以設定使用權限的~~
雖然實務上不曾用過,不過還滿有趣的。
1. 使用Windows登入腳色
1. 使用Windows登入腳色
2. 使用自訂使用者
一、
使用Windows登入腳色
l 在需要設定呼叫權限的Class (或方法) 加上以下Attribute
[PrincipalPermission(SecurityAction.Demand, Role = @"Administrator")]
class MyClass
{
…
}
[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。
//設定目前執行緒識別的方法:對應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 : 主要使用權限的要求失敗。
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則會造成權限失敗。
//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 結束。
沒有留言:
張貼留言