.NET 实现自定义ContextUser的Identity和Principal实现自定义用户信息,权限验证。
备用收藏,http://blog.csdn.net/msdnxgh/article/details/6894885
.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 %>//用户所在部门
自定义显示用户信息后,我们接着利用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 实现自定义ContextUser的Identity和Principal实现自定义用户信息,权限验证。的更多相关文章
- [.Net MVC] 用户角色权限管理_使用CLK.AspNet.Identity
项目:后台管理平台 意义:一个完整的管理平台需要提供用户注册.登录等功能,以及认证和授权功能. 一.为何使用CLK.AspNet.Identity 首先简要说明所采取的权限控制方式.这里采用了基于角色 ...
- MVC 自定义AuthorizeAttribute 实现权限验证
MVC内置的AuthorizeFilter先于Action/Result过滤器执行,为网站权限验证提供了很好的一套验证机制. 通过自定义的AuthorizeAttribute可以实现对用户权限的验证. ...
- Identity Server 4 - Hybrid Flow - MVC客户端身份验证
预备知识 可能需要看一点点预备知识 OAuth 2.0 不完全简介: https://www.cnblogs.com/cgzl/p/9221488.html OpenID Connect 不完全简介: ...
- 自定义shiro实现权限验证方法isAccessAllowed
由于Shiro filterChainDefinitions中 roles默认是and, admin= user,roles[system,general] 比如:roles[system,gener ...
- 自定义Dialog的详细步骤(实现自定义样式一般原理)
现在很多App的提示对话框都非常有个性,然而你还用系统的对话框样式,是不是觉得很落后呢,今天我就给大家讲讲怎样自定义自己的Dialog,学会了之后,你就会根据自家app的主题,设计出相应的Dialog ...
- springboot + 拦截器 + 注解 实现自定义权限验证
springboot + 拦截器 + 注解 实现自定义权限验证最近用到一种前端模板技术:jtwig,在权限控制上没有用springSecurity.因此用拦截器和注解结合实现了权限控制. 1.1 定义 ...
- CAD由一个自定义实体事件中的id得到自定义实体对象(com接口VB语言)
由一个自定义实体事件中的id得到自定义实体对象.该函数只能在自定义实体事件中调用. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2 ...
- SpringMVC拦截器+Spring自定义注解实现权限验证
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- springcloud项目实现自定义权限注解进行接口权限验证
一般在项目开发中会根据登录人员的权限大小对接口也会设置权限,那么对接口权限是怎么实现的呢,大多数都是用自定义权限注解,只需要在接口上加上一个注解就可以实现对接口的权限拦截,是否对该接口有权调用 接下来 ...
随机推荐
- c# winform TreeView NODE(节点) 重命名或获取节点修改后的值
在程序开发过程中我们经常用到treeview,还经常要修改节点的名字.节点名字修改后还想及时更新数据库.这时问题就来了,怎样获取NODE(节点)更新后的值呢?本人试了很多方法最终分析出treeview ...
- 浅谈OpenGL变换矩阵
OpenGL中使用的矩阵全为列向量为主的矩阵. 参考OpenGL变换网站为 http://www.songho.ca/opengl/gl_transform.html 1.什么是GL_MODELVI ...
- mysql与oracle的存储过程有什么区别?
MySQL存储过程 (1). 格式 MySQL存储过程创建的格式:CREATE PROCEDURE过程名 ([过程参数[,...]]) [特性 ...]过程体 案例分析: 参数 MySQL存储过程的参 ...
- 【浅析】IMU代码
IMU的代码的引自https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/imumargalgo ...
- vagrant系列教程(四):vagrant搭建redis与redis的监控程序redis-stat(转)
上一篇php7环境的搭建 真是火爆,仅仅两天时间,就破了我之前swagger系列的一片文章,看来,大家对搭建环境真是情有独钟. 为了访问量,我今天再来一篇Redis的搭建.当然不能仅仅是redis的搭 ...
- Linux_03------Linux的基本命令
/** * 基本命令格式 * 命令 [选项] [参数] */ /** * 目录处理命令 * mkdir dirname 创建目录 * mkdir -p dir1/dir 递归创建目录 * cd dir ...
- Brn系列商城4.1正式发布,欢迎大家下载体验
此次升级内容如下: 独立IP搜索策略 独立文件上传策略 添加退换货功能 重构支付方式 常规性修复和改进 下载地址:http://www.brnshop.com
- 在Linux下使用RAID--使用mdadm工具创建软件Raid 0(1)
在Linux下使用RAID--使用mdadm工具创建软件Raid 0(1) RAID即廉价磁盘冗余阵列,其高可用性和可靠性适用于大规模环境中,相比正常使用,数据更需要被保护.RAID是一些磁盘的集合, ...
- ubuntu 14 配置 tomcat
参考 http://www.linuxidc.com/Linux/2015-01/111119.htm
- Ubuntu-12.04-server 配置修改静态 IP地址
前几天在装Ubuntu 12.04 Server版系统的服务器时IP地址写错了,导致服务器不能上网,今天重新修改了一下IP地址,这里做一个总结. 1.配置静态IP地址 sudo vi /etc/net ...