.NET 实现自定义ContextUser的Identity和Principal实现自定义用户信息,权限验证。
2011-10-21 19:18
681 查看
.NET 实现自定义ContextUser的Identity和Principal
在传统的.NET中,我们可以通过
但这样的机制,在实际开发中,难以满足开发需要.仅仅通过User.Identity.Name;获取用户名,和User.Identity.IsAuthenticated;判断用户是否验证,是难以满足需要。如何获取用户更多信息,或者进行更详细的权限判断。
我们可以通过自定义Identity和Principal进行实现!
好,上面我们己实现了自定义,Identity和Principal。
我们可以在页面这样使用Identity。
自定义显示用户信息后,我们接着利用Principal进行权限验证和控制
在Asp.net Web模式下,使用方式:
首先,我们先做一个权限验证基类!
OK,到了验证页的时候了。
事实上,在Asp.net MVC模式,更容易对权限进行控制,可以进行更多的细化,对每个动作进行控制。
MVC模式下:
首先,先实现一个权限验证基类:
回到控制器,进行权限验证
无论对Asp.net Form或者Aap.net MVC,都在一个按钮级的权限控制,
那对于,按钮级的权限如何进行控制昵?
看下面代码
至此,如何实现自定义Identity和Principal,进行整合更多用户信息,和权限验证。己经介绍完了。
更多问题,请大家加入.NET技术群进行讨论.群号是:160046333,欢迎加入。
在传统的.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 %>//用户所在部门
自定义显示用户信息后,我们接着利用Principal进行权限验证和控制
在Asp.net Web模式下,使用方式:
首先,我们先做一个权限验证基类!
/// <summary> ///权限验证基类 /// </summary> public class BasePaper:System.Web.UI.Page { public BasePaper() { // //TODO: 在此处添加构造函数逻辑 // } protected override void OnInit(EventArgs e) { BasePage_Load(); } /// <summary> /// 设置权限,默认值为0 /// </summary> public virtual int PermissionID { get { return 0; } } /// <summary> /// 验证方法 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BasePage_Load() { //权限检查 #region 权限检查 bool Permission = true;//初始值为没有权限 //这一步很重要,要代替.NET的自身的User. ContextUser.MyPrincipal MyPrincipal = new ContextUser.MyPrincipal(HttpContext.Current.User.Identity.Name); HttpContext.Current.User = MyPrincipal; if ((User as account.ContextUser.MyPrincipal).PermissionList.Contains(PermissionID)) { Permission = false;//验证通过 } if (Permission)//权限验证不通过 { Response.Clear(); Response.Write("<script language=\"javascript\">alert(\"对不起,你没有权限进入\");history.go(-1);</script>"); Response.End(); } #endregion } }
OK,到了验证页的时候了。
public partial class ascx_Add :BasePage { public override int PermissionID { get { return 13;//返回要验证权限值 } } protected void Page_Load(object sender, EventArgs e) { // } }
事实上,在Asp.net MVC模式,更容易对权限进行控制,可以进行更多的细化,对每个动作进行控制。
MVC模式下:
首先,先实现一个权限验证基类:
/// <summary> /// 权限验证基类 /// 2011.7.3 /// </summary> public class BasePage : AuthorizeAttribute { /// <summary> /// 权限值 /// </summary> private int _permissionID = 0; /// <summary /// 权限值 /// </summary> public int PermissionID { get { return _permissionID; } set { _permissionID = value; } } /// <summary> /// 在过程请求授权时调用。 /// </summary> /// <param name="filterContext">对象包括控制器、HTTP 上下文、请求上下文、操作结果和路由数据。</param> public override void OnAuthorization(AuthorizationContext filterContext) { if (HttpContext.Current.User.Identity.IsAuthenticated) { //这一步很重要,要代替.NET的自身的User. ContextUser.MyPrincipal MyPrincipal = new ContextUser.MyPrincipal(HttpContext.Current.User.Identity.Name); HttpContext.Current.User = MyPrincipal; if ((!MyPrincipal.ISPermissionID(_permissionID)) && (_permissionID != 0)) { HttpContext.Current.Response.Clear(); HttpContext.Current.Response.Write("<script defer>window.alert('无权操作!');history.back();</script>"); HttpContext.Current.Response.End(); filterContext.Result = new EmptyResult(); } } else { FormsAuthentication.SignOut(); HttpContext.Current.Response.Clear(); HttpContext.Current.Response.Write("<script defer>window.alert('无权操作!或当前登录用户已过期!\\n请重新登录或与管理员联系!');</script>"); HttpContext.Current.Response.End(); filterContext.Result = new EmptyResult(); } } }
回到控制器,进行权限验证
[BasePage(PermissionID = 13)]//返回要验证权限值 public ActionResult Index() { // }
无论对Asp.net Form或者Aap.net MVC,都在一个按钮级的权限控制,
那对于,按钮级的权限如何进行控制昵?
看下面代码
//控制删除按扭的显示 <% if((User as account.ContextUser.MyPrincipal).PermissionList.Contains(13) {%> <input type="submit" name="button" id="button" value="删除" /> <%} %>
至此,如何实现自定义Identity和Principal,进行整合更多用户信息,和权限验证。己经介绍完了。
更多问题,请大家加入.NET技术群进行讨论.群号是:160046333,欢迎加入。
相关文章推荐
- .NET 实现自定义ContextUser的Identity和Principal实现自定义用户信息,权限验证
- .NET 实现自定义ContextUser的Identity和Principal实现自定义用户信息,权限验证。
- .NET 实现自定义ContextUser的Identity和Principal实现自定义用户信息,权限验证。
- NET 实现自定义ContextUser的Identity和Principal实现自定义用户信息,权限验证
- 使用HttpContext中的User属性来实现用户身份验证之用户验证票篇
- 使用HttpContext的User属性来实现用户验证
- 使用HttpContext的User属性来实现用户身份验证
- 【Spring Security】三、自定义数据库实现对用户信息和权限信息的管理
- 使用HttpContext的User属性来实现用户验证
- 使用HttpContext的User属性来实现用户验证
- 使用HttpContext的User属性来实现用户验证-.NET教程
- How to use the windows active directory to authenticate user via logon form 如何自定义权限系统,使用 active directory验证用户登录
- ASP.Net Mvc实现自定义User Identity用户身份识别系统(2)
- 使用HttpContext的User属性来实现用户验证[转载]
- 使用HttpContext的User属性来实现用户验证
- 使用HttpContext中的User属性来实现用户身份验证之用户验证票篇
- 使用HttpContext的User属性来实现用户身份验证
- 使用HttpContext的User属性来实现用户验证
- 使用HttpContext中的User属性来实现用户身份验证之用户验证票篇[转载]
- 使用HttpContext的User属性来实现用户验证[转载]