.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 %>//用户所在部门