.NET 实现自定义ContextUser的Identity和Principal

在传统的.NET中,我们可以通过

[csharp] view plaincopyprint?
  1. User.Identity.Name;//获取用户名
  2. User.Identity.IsAuthenticated;//判断用户是否己验证
  3. User.IsInRole("Admin");//判断用户是否含有指定角色
        User.Identity.Name;//获取用户名User.Identity.IsAuthenticated;//判断用户是否己验证User.IsInRole("Admin");//判断用户是否含有指定角色

但这样的机制,在实际开发中,难以满足开发需要.仅仅通过User.Identity.Name;获取用户名,和User.Identity.IsAuthenticated;判断用户是否验证,是难以满足需要。如何获取用户更多信息,或者进行更详细的权限判断。

我们可以通过自定义Identity和Principal进行实现!

[csharp] view plaincopyprint?
  1. /// <summary>
  2. /// 自定义当前用户标识对象
  3. /// </summary>
  4. public class MyIdentity:IIdentity
  5. {
  6. #region 用户属性(可自定义更多信息)
  7. private string _userName;//用户账号
  8. private string _departmnet;//用户所在部门
  9. private string _phone;//用户联系电话
  10. #endregion
  11. /// <summary>
  12. /// 用户账号
  13. /// </summary>
  14. public string UserName
  15. {
  16. get { return _userName; }
  17. }
  18. /// <summary>
  19. /// 用户所在部门
  20. /// </summary>
  21. public string Departmnet
  22. {
  23. get { return _departmnet; }
  24. }
  25. /// <summary>
  26. /// 用户电话
  27. /// </summary>
  28. public string Phone
  29. {
  30. get { return _phone; }
  31. }
  32. /// <summary>
  33. /// 构造函数,根据用户名
  34. /// </summary>
  35. /// <param name="UserName"></param>
  36. public MyIdentity(string UserName)
  37. {
  38. //根据UserName查询数据库获得以下数据
  39. this._userName = "abc";
  40. this._departmnet = "行政部";
  41. this._phone = "123456";
  42. }
  43. /// <summary>
  44. /// 构造函数,根据用户ID
  45. /// </summary>
  46. /// <param name="UserID"></param>
  47. public MyIdentity(int UserID)
  48. {
  49. //根据UserName查询数据库获得以下数据
  50. this._userName = "abc";
  51. this._departmnet = "行政部";
  52. this._phone = "123456";
  53. }
  54. #region 基本属性
  55. /// <summary>
  56. /// 返回验证方式
  57. /// </summary>
  58. public string AuthenticationType
  59. {
  60. get { return "Form"; }
  61. }
  62. /// <summary>
  63. /// 是否验证
  64. /// </summary>
  65. public bool IsAuthenticated
  66. {
  67. get { return true; }
  68. }
  69. /// <summary>
  70. /// 返回用户
  71. /// </summary>
  72. public string Name
  73. {
  74. get { return _userName; }
  75. }
  76. #endregion
  77. }
    /// <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}
[csharp] view plaincopyprint?
  1. /// <summary>
  2. /// 当前用户安全上下文信息
  3. /// </summary>
  4. public class MyPrincipal:IPrincipal
  5. {
  6. #region 属性
  7. private IIdentity _identity;//用户标识
  8. private ArrayList _permissionList;//权限列表
  9. #endregion
  10. /// <summary>
  11. /// 返回用户权限列表
  12. /// </summary>
  13. public ArrayList PermissionList
  14. {
  15. get { return _permissionList; }
  16. }
  17. /// <summary>
  18. /// 获取当前用户标识
  19. /// </summary>
  20. public IIdentity Identity
  21. {
  22. get { return _identity; }
  23. }
  24. /// <summary>
  25. /// 当前用户是否指定角色(采用权限值方式,此处返回false)
  26. /// </summary>
  27. /// <param name="role"></param>
  28. /// <returns></returns>
  29. public bool IsInRole(string role)
  30. {
  31. return false;//返回false
  32. }
  33. /// <summary>
  34. /// 构造函数,用户名构造
  35. /// </summary>
  36. /// <param name="UserName"></param>
  37. public MyPrincipal(string UserName)
  38. {
  39. _identity = new MyIdentity(UserName);
  40. //以下权限根据UserName获取数据库用户拥有的权限值,此次省略
  41. _permissionList = new ArrayList();
  42. _permissionList.Add(1);
  43. _permissionList.Add(2);
  44. _permissionList.Add(3);
  45. _permissionList.Add(4);
  46. _permissionList.Add(5);
  47. }
  48. /// <summary>
  49. /// 构造函数,用户ID构造
  50. /// </summary>
  51. /// <param name="UserID"></param>
  52. public MyPrincipal(int UserID)
  53. {
  54. _identity = new MyIdentity(UserID);
  55. //以下权限根据UserName获取数据库用户拥有的权限值,此次省略
  56. _permissionList = new ArrayList();
  57. _permissionList.Add(1);
  58. _permissionList.Add(2);
  59. _permissionList.Add(3);
  60. _permissionList.Add(4);
  61. _permissionList.Add(5);
  62. }
  63. /// <summary>
  64. /// 判断用户是否拥有某权限
  65. /// </summary>
  66. /// <param name="permissionid"></param>
  67. /// <returns></returns>
  68. public bool IsPermissionID(int permissionid)
  69. {
  70. return _permissionList.Contains(permissionid);
  71. }
  72. }
    /// <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。

[csharp] view plaincopyprint?
  1. //页面中输出自定义用户信息
  2. <%=(User.Identity as ContextUser.MyIdentity).Name %>//用户账号
  3. <%=(User.Identity as ContextUser.MyIdentity).Phone %>//用户电话
  4. <%=(User.Identity as ContextUser.MyIdentity).Departmnet %>//用户所在部门
//页面中输出自定义用户信息<%=(User.Identity as ContextUser.MyIdentity).Name %>//用户账号<%=(User.Identity as ContextUser.MyIdentity).Phone %>//用户电话<%=(User.Identity as ContextUser.MyIdentity).Departmnet %>//用户所在部门

自定义显示用户信息后,我们接着利用Principal进行权限验证和控制

在Asp.net Web模式下,使用方式:

首先,我们先做一个权限验证基类!

[csharp] view plaincopyprint?
  1. /// <summary>
  2. ///权限验证基类
  3. /// </summary>
  4. public class BasePaper:System.Web.UI.Page
  5. {
  6. public BasePaper()
  7. {
  8. //
  9. //TODO: 在此处添加构造函数逻辑
  10. //
  11. }
  12. protected override void OnInit(EventArgs e)
  13. {
  14. BasePage_Load();
  15. }
  16. /// <summary>
  17. /// 设置权限,默认值为0
  18. /// </summary>
  19. public virtual int PermissionID
  20. {
  21. get { return 0; }
  22. }
  23. /// <summary>
  24. /// 验证方法
  25. /// </summary>
  26. /// <param name="sender"></param>
  27. /// <param name="e"></param>
  28. private void BasePage_Load()
  29. {
  30. //权限检查
  31. #region 权限检查
  32. bool Permission = true;//初始值为没有权限
  33. //这一步很重要,要代替.NET的自身的User.
  34. ContextUser.MyPrincipal MyPrincipal = new ContextUser.MyPrincipal(HttpContext.Current.User.Identity.Name);
  35. HttpContext.Current.User = MyPrincipal;
  36. if ((User as account.ContextUser.MyPrincipal).PermissionList.Contains(PermissionID))
  37. {
  38. Permission = false;//验证通过
  39. }
  40. if (Permission)//权限验证不通过
  41. {
  42. Response.Clear();
  43. Response.Write("<script language=\"javascript\">alert(\"对不起,你没有权限进入\");history.go(-1);</script>");
  44. Response.End();
  45. }
  46. #endregion
  47. }
  48. }
/// <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,到了验证页的时候了。

[csharp] view plaincopyprint?
  1. public partial class ascx_Add :BasePage
  2. {
  3. public override int PermissionID
  4. {
  5. get
  6. {
  7. return 13;//返回要验证权限值
  8. }
  9. }
  10. protected void Page_Load(object sender, EventArgs e)
  11. {
  12. //
  13. }
  14. }
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模式下:

首先,先实现一个权限验证基类:

[csharp] view plaincopyprint?
  1. /// <summary>
  2. /// 权限验证基类
  3. /// 2011.7.3
  4. /// </summary>
  5. public class BasePage : AuthorizeAttribute
  6. {
  7. /// <summary>
  8. /// 权限值
  9. /// </summary>
  10. private int _permissionID = 0;
  11. /// <summary
  12. /// 权限值
  13. /// </summary>
  14. public int PermissionID
  15. {
  16. get { return _permissionID; }
  17. set { _permissionID = value; }
  18. }
  19. /// <summary>
  20. /// 在过程请求授权时调用。
  21. /// </summary>
  22. /// <param name="filterContext">对象包括控制器、HTTP 上下文、请求上下文、操作结果和路由数据。</param>
  23. public override void OnAuthorization(AuthorizationContext filterContext)
  24. {
  25. if (HttpContext.Current.User.Identity.IsAuthenticated)
  26. {
  27. //这一步很重要,要代替.NET的自身的User.
  28. ContextUser.MyPrincipal MyPrincipal = new ContextUser.MyPrincipal(HttpContext.Current.User.Identity.Name);
  29. HttpContext.Current.User = MyPrincipal;
  30. if ((!MyPrincipal.ISPermissionID(_permissionID)) && (_permissionID != 0))
  31. {
  32. HttpContext.Current.Response.Clear();
  33. HttpContext.Current.Response.Write("<script defer>window.alert('无权操作!');history.back();</script>");
  34. HttpContext.Current.Response.End();
  35. filterContext.Result = new EmptyResult();
  36. }
  37. }
  38. else
  39. {
  40. FormsAuthentication.SignOut();
  41. HttpContext.Current.Response.Clear();
  42. HttpContext.Current.Response.Write("<script defer>window.alert('无权操作!或当前登录用户已过期!\\n请重新登录或与管理员联系!');</script>");
  43. HttpContext.Current.Response.End();
  44. filterContext.Result = new EmptyResult();
  45. }
  46. }
  47. }
    /// <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();}}}

回到控制器,进行权限验证

[csharp] view plaincopyprint?
  1. [BasePage(PermissionID = 13)]//返回要验证权限值
  2. public ActionResult Index()
  3. {
  4. //
  5. }
        [BasePage(PermissionID = 13)]//返回要验证权限值public ActionResult Index(){//}

无论对Asp.net Form或者Aap.net MVC,都在一个按钮级的权限控制,

那对于,按钮级的权限如何进行控制昵?

看下面代码

[csharp] view plaincopyprint?
  1. //控制删除按扭的显示
  2. <% if((User as account.ContextUser.MyPrincipal).PermissionList.Contains(13) {%>
  3. <input type="submit" name="button" id="button" value="删除" />
  4. <%} %>
    //控制删除按扭的显示<% if((User as account.ContextUser.MyPrincipal).PermissionList.Contains(13) {%><input type="submit" name="button" id="button" value="删除" /><%} %>

至此,如何实现自定义Identity和Principal,进行整合更多用户信息,和权限验证。己经介绍完了。

转载于:https://www.cnblogs.com/aweifly/archive/2012/09/30/2709148.html

.NET 实现自定义ContextUser的Identity和Principal实现自定义用户信息,权限验证。相关推荐

  1. [WCF权限控制]利用WCF自定义授权模式提供当前Principal[实例篇]

    在<原理篇>中我们谈到:如果采用自定义安全主体权限模式,我们可以通过自定义AuthorizationPolicy或者ServiceAuthorizationManager实现对基于当前认证 ...

  2. [WCF权限控制]利用WCF自定义授权模式提供当前Principal[原理篇]

    在<通过扩展自行实现服务授权>一文中,我通过自定义CallContextInitializer的方式在操作方法之前之前根据认证用户设置了当前线程的安全主体,从而实现授权的目的.实际上,WC ...

  3. 如何在App中实现朋友圈功能之二快速实现用户信息的自定义——箭扣科技Arrownock...

    如何在App中实现朋友圈功能 之二 快速实现用户信息的自定义 自我关联社交元素: anSocial中很多的社交元素API,如帖子(Post).相册(Album).文件(File)等,这些API的可选参 ...

  4. pandas编写自定义函数、使用apply函数应用自定义函数基于Series数据生成新的dataframe

    pandas编写自定义函数.使用apply函数应用自定义函数基于Series数据生成新的dataframe 目录 pandas编写自定义函数.使用apply函

  5. R语言使用treemap包中的treemap函数可视化treemap图:treemap将分层数据显示为一组嵌套矩形、自定义设置treemap图的调色板、自定义设置treemap标题字体的大小

    R语言使用treemap包中的treemap函数可视化treemap图:treemap将分层数据显示为一组嵌套矩形.自定义设置treemap图的调色板.自定义设置treemap标题字体的大小 目录

  6. R语言ggplot2可视化:在ggplot2中将图例(legend)移到图内、自定义图例所处的位置、自定义图例背景、图例所处边框的颜色

    R语言ggplot2可视化:在ggplot2中将图例(legend)移到图内.自定义图例所处的位置.自定义图例背景.图例所处边框的颜色 目录

  7. Python可视化matplotlib自定义:运行时参数修改、自定义样式、默认样式+plt.style.use()

    Python可视化matplotlib自定义:运行时参数修改.自定义样式.默认样式+plt.style.use() 目录 Python可视化matplotlib自定义:运行时参数修改.自定义样式.默认 ...

  8. android 自定义图片容器,Android应用开发中自定义ViewGroup视图容器的教程

    一.概述在写代码之前,我必须得问几个问题: 1.ViewGroup的职责是啥?ViewGroup相当于一个放置View的容器,并且我们在写布局xml的时候,会告诉容器(凡是以layout为开头的属性, ...

  9. springboot + 拦截器 + 注解 实现自定义权限验证

    springboot + 拦截器 + 注解 实现自定义权限验证 最近用到一种前端模板技术:jtwig,在权限控制上没有用springSecurity.因此用拦截器和注解结合实现了权限控制. 1.1 定 ...

最新文章

  1. 几种常用的Java数据源解决方案
  2. SqlServer操作远程数据库
  3. 简(kun)单(nan)到让我开(jue)心(wang)的后缀自动机全家桶(普通后缀、广义后缀、子序列)...
  4. UA MATH524 复变函数9 柯西公式与幂级数展开
  5. I can accept failure but I can't accept not trying.-Michael Jordan 我可以接受失败,但绝对不能接受自己都未曾奋斗过。-迈克.乔丹...
  6. 你这么喜欢敲代码,那么技术的乐趣在哪里?
  7. html获取此次点击的id,github项目解析(八)--Activity启动过程中获取组件宽高的三种方式...
  8. 应届毕业生找工作很迷茫?4招教你快速破局,应届生必看!
  9. 天道酬勤~我如此惬意
  10. kinect fusion 3D重建基本算法
  11. 【房卡棋牌教程】,制作进入房间小界面
  12. 串行异步通信_什么是并行传输、串行传输、异步传输?
  13. 小程序微信小程序设计登录页面
  14. 163net邮箱,对商务办公人士有哪些帮助?
  15. 洛谷 P1875 佳佳的魔法药水(最短路) 题解
  16. NANO-stm32F103-HAL库基础指南--开发板硬件介绍
  17. 生成二维码,用安卓手机扫直接下载apk,用苹果手机扫跳转至appstore
  18. Java架构师 学习大纲
  19. 数据集【NO.8】红外海上船舶数据集
  20. 剑英陪你玩转图形学 (三)归去来

热门文章

  1. 在delphi中嵌入腳本語言--(譯)RemObjects Pascal Script使用說明(1)(譯)
  2. python学习笔记全过程_Python学习笔记一(Hello World)
  3. KafkaController 分区Rebalance平衡机制
  4. (15)QuartusII 17.1开发流程(FPGA不积跬步101)
  5. mongodb mysql数据类型_mongodb中数据类型的坑
  6. 本科生 计算机图形学试卷,湖南工程学院《计算机图形学》毕业补考试卷及答案...
  7. ESP8266使用方法
  8. 06.Qt菜单栏工具栏学习(一)
  9. php取整数余数,js取整数、取余数的方法
  10. 3dmax脚本_3DMax二种距离测量方法