1.概述
為了確定應用程式的安全,安全性有幾個重要方面需要考慮。一是應用程式的使用者,通路應用程式的是一個真正的使用者,還是僞裝成使用者的某個人?如何确定這個使用者是可以信任的?
確定應用程式安全的使用者方面是一個2個階段過程:
- 使用者首先需要身份驗證
-
再進行授權,已驗證該使用者是否可以使用需要的資源
對于在網絡上存儲或發送的資料呢?例如,有人可以通過網絡嗅探器通路這些資料嗎?這裡資料加密很重要。一些技術,如WCF,通過簡單的配置提供了加密功能,是以可以看到背景執行了什麼操作。
另一方面是應用程式本身。如果應用程式駐留在WEB提供程式上,如何禁止應用程式執行對伺服器有傷害的操作?
2.身份驗證和授權
安全性的兩個基本支柱是身份驗證和授權。身份驗證是辨別使用者的過程,授權在驗證了所辨別使用者是否可以通路特定資源之後進行。
2.1辨別和Principal
使用辨別可以驗證運作應該程式的使用者。Windows Indentity 類表示一個Windows使用者。如果沒有用windows賬戶辨別使用者,也可以使用實作了Identity接口的其他類。通過這個接口可以通路使用者名,該使用者是否通過身份驗證,以及驗證類型等資訊。
Principal是一個包含使用者的辨別和使用者的所屬角色的對象。IPrincipal接口定義了Identity屬性和IsInRole方法,Identity屬性傳回Identity對象;在IsInRole方法中,可以驗證使用者是否是指定角色的一個成員。角色是有相同安全權限的使用者集合,同時它是使用者的管理單元。角色可以是Windows組或自己定義的一個字元串集合。
表示 Windows 使用者。
命名空間: System.Security.Principal
程式集: mscorlib(位于 mscorlib.dll)
繼承層次結構
System.Object
System.Security.Claims.ClaimsIdentity
System.Security.Principal.WindowsIdentity
文法
[SerializableAttribute]
[ComVisibleAttribute(true)]
public class WindowsIdentity : ClaimsIdentity, ISerializable,
IDeserializationCallback, IDisposable
構造函數
名稱 | 說明 |
---|---|
WindowsIdentity(IntPtr) | 為指定的 Windows 帳戶标記表示的使用者初始化 WindowsIdentity 類的新執行個體。 |
WindowsIdentity(IntPtr, String) | 為指定的 Windows 帳戶标記和指定的身份驗證類型表示的使用者初始化 WindowsIdentity 類的新執行個體。 |
WindowsIdentity(IntPtr, String, WindowsAccountType) | 為指定的 Windows 帳戶标記、指定的身份驗證類型和指定的 Windows 帳戶類型表示的使用者初始化 WindowsIdentity 類的新執行個體。 |
WindowsIdentity(IntPtr, String, WindowsAccountType, Boolean) | 為指定的 Windows 帳戶标記、指定的身份驗證類型、指定的 Windows 帳戶類型和指定的身份驗證狀态表示的使用者初始化 WindowsIdentity 類的新執行個體。 |
WindowsIdentity(SerializationInfo, StreamingContext) | 初始化 SerializationInfo 流中的資訊所表示的使用者的 WindowsIdentity 類的新執行個體。 |
WindowsIdentity(String) | 初始化以指定使用者主名稱 (UPN) 表示的使用者的 WindowsIdentity 類的新執行個體。 |
WindowsIdentity(String, String) | 初始化以指定使用者主名稱 (UPN) 和指定身份驗證類型共同表示的使用者的 WindowsIdentity 類的新執行個體。 |
WindowsIdentity(WindowsIdentity) | 使用指定的 WindowsIdentity 對象初始化 WindowsIdentity 類的新執行個體。 |
屬性
方法
字段
顯式接口實作
protected void Page_Load(object sender, EventArgs e)
{
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
var principal = WindowsPrincipal.Current as WindowsPrincipal;
var identity = principal.Identity as WindowsIdentity;
Console.WriteLine("IdentityType:{0}",identity.ToString());
Console.WriteLine("Name:{0}", identity.Name);
Console.WriteLine("'user'?:{0}", principal.IsInRole(WindowsBuiltInRole.User));
Console.WriteLine("'administrtors'?:{0}", principal.IsInRole(WindowsBuiltInRole.Administrator));
Console.WriteLine("'authenticated'?:{0}",identity.IsAuthenticated);
Console.WriteLine("'authtype'?:{0}", identity.AuthenticationType);
Console.WriteLine("'anonymoues'?:{0}", identity.IsAnonymous);
Console.WriteLine("'token'?:{0}", identity.Token);
}
很顯然使用者可以很容易通路目前使用者及其角色的詳細資訊,然後使用那些資訊決定允許或拒絕使用者執行某些動作,這就非常有好處。利用角色和windows使用者組,管理者可以完成标準使用者管理工具所能完成的工作,這樣在使用者的角色改變時,通常可以避免代碼的更改。