.NET 實現自訂ContextUser的Identity和Principal
在傳統的.NET中,我們可以通過
User.Identity.Name;//擷取使用者名稱
User.Identity.IsAuthenticated;//判斷使用者是否己驗證
User.IsInRole("Admin");//判斷使用者是否含有指定角色
但這樣的機制,在實際開發中,難以滿足開發需要.僅僅通過User.Identity.Name;擷取使用者名稱,和User.Identity.IsAuthenticated;判斷使用者是否驗證,是難以滿足需要。如何擷取使用者更多資訊,或者進行更詳細的許可權判斷。
我們可以通過自訂Identity和Principal進行實現!
/// <summary>
/// 自訂目前使用者標識對象
/// </summary>
public class MyIdentity:IIdentity
{
#region 使用者屬性(可自訂更多資訊)
private string _userName;//使用者帳號
private string _departmnet;//使用者所在部門
private string _phone;//使用者聯絡電話
#endregion
/// <summary>
/// 使用者帳號
/// </summary>
public string UserName
{
get { return _userName; }
}
/// <summary>
/// 使用者所在部門
/// </summary>
public string Departmnet
{
get { return _departmnet; }
}
/// <summary>
/// 使用者電話
/// </summary>
public string Phone
{
get { return _phone; }
}
/// <summary>
/// 建構函式,根據使用者名稱
/// </summary>
/// <param name="UserName"></param>
public MyIdentity(string UserName)
{
//根據UserName查詢資料庫獲得以下資料
this._userName = "abc";
this._departmnet = "行政部";
this._phone = "123456";
}
/// <summary>
/// 建構函式,根據使用者ID
/// </summary>
/// <param name="UserID"></param>
public MyIdentity(int UserID)
{
//根據UserName查詢資料庫獲得以下資料
this._userName = "abc";
this._departmnet = "行政部";
this._phone = "123456";
}
#region 基本屬性
/// <summary>
/// 返回驗證方式
/// </summary>
public string AuthenticationType
{
get { return "Form"; }
}
/// <summary>
/// 是否驗證
/// </summary>
public bool IsAuthenticated
{
get { return true; }
}
/// <summary>
/// 返回使用者
/// </summary>
public string Name
{
get { return _userName; }
}
#endregion
}
/// <summary>
/// 目前使用者安全上下文資訊
/// </summary>
public class MyPrincipal:IPrincipal
{
#region 屬性
private IIdentity _identity;//使用者標識
private ArrayList _permissionList;//許可權列表
#endregion
/// <summary>
/// 返回使用者權限列表
/// </summary>
public ArrayList PermissionList
{
get { return _permissionList; }
}
/// <summary>
/// 擷取目前使用者標識
/// </summary>
public IIdentity Identity
{
get { return _identity; }
}
/// <summary>
/// 目前使用者是否指定角色(採用許可權值方式,此處返回false)
/// </summary>
/// <param name="role"></param>
/// <returns></returns>
public bool IsInRole(string role)
{
return false;//返回false
}
/// <summary>
/// 建構函式,使用者名稱構造
/// </summary>
/// <param name="UserName"></param>
public MyPrincipal(string UserName)
{
_identity = new MyIdentity(UserName);
//以下許可權根據UserName擷取資料庫使用者擁有的許可權值,此次省略
_permissionList = new ArrayList();
_permissionList.Add(1);
_permissionList.Add(2);
_permissionList.Add(3);
_permissionList.Add(4);
_permissionList.Add(5);
}
/// <summary>
/// 建構函式,使用者ID構造
/// </summary>
/// <param name="UserID"></param>
public MyPrincipal(int UserID)
{
_identity = new MyIdentity(UserID);
//以下許可權根據UserName擷取資料庫使用者擁有的許可權值,此次省略
_permissionList = new ArrayList();
_permissionList.Add(1);
_permissionList.Add(2);
_permissionList.Add(3);
_permissionList.Add(4);
_permissionList.Add(5);
}
/// <summary>
/// 判斷使用者是否擁有某許可權
/// </summary>
/// <param name="permissionid"></param>
/// <returns></returns>
public bool IsPermissionID(int permissionid)
{
return _permissionList.Contains(permissionid);
}
}
好,上面我們己實現了自訂,Identity和Principal。
我們可以在頁面這樣使用Identity。
//頁面中輸出自訂使用者資訊
<%=(User.Identity as ContextUser.MyIdentity).Name %>//使用者帳號
<%=(User.Identity as ContextUser.MyIdentity).Phone %>//使用者電話
<%=(User.Identity as ContextUser.MyIdentity).Departmnet %>//使用者所在部門