一、Forms认证流程

请先参考如下网址:

http://www.cnblogs.com/fish-li/archive/2012/04/15/2450571.html

本文主要介绍使用自定义的身份认证表示来实现认证

二、自定义的身份认证主要流程

主要代码如下:

  1..登录验证完用户名和密码后写入Cookie信息

  1. public static HttpCookie SingIn(string loginName,TUserData userData,int expiration)
  2. {
  3. if (string.IsNullOrEmpty(loginName))
  4. throw new ArgumentNullException("loginName");
  5. if (userData == null)
  6. throw new ArgumentNullException("userData");
  7. // 1. 把需要保存的用户数据转成一个字符串。
  8. string data = null;
  9. if (userData != null)
  10. data = JsonConvert.SerializeObject(userData);
  11. //(new JavaScriptSerializer()).Serialize(userData);
  12. // 2. 创建一个FormsAuthenticationTicket,它包含登录名以及额外的用户数据。
  13. FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
  14. , loginName, DateTime.Now, DateTime.Now.AddDays(), true, data);
  15. // 3. 加密Ticket,变成一个加密的字符串。
  16. string cookieValue = FormsAuthentication.Encrypt(ticket);
  17. // 4. 根据加密结果创建登录Cookie
  18. HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieValue);
  19. cookie.HttpOnly = true;
  20. cookie.Secure = FormsAuthentication.RequireSSL;
  21. cookie.Domain = FormsAuthentication.CookieDomain;
  22. cookie.Path = FormsAuthentication.FormsCookiePath;
  23. if (expiration > )
  24. cookie.Expires = DateTime.Now.AddMinutes(expiration);
  25.  
  26. HttpContext context = HttpContext.Current;
  27. if (context == null)
  28. throw new InvalidOperationException();
  29.  
  30. // 5. 写登录Cookie
  31. context.Response.Cookies.Remove(cookie.Name);
  32. context.Response.Cookies.Add(cookie);
  33. return cookie;
  34. }

  2.在Global.asax 中解析Cookie携带的自定义信息

  1. protected void Application_AuthenticateRequest(object sender, EventArgs e)
  2. {
  3. HttpApplication app = (HttpApplication)sender;
  4. UserFormsPrincipal<UserInfo>.TrySetUserInfo(app.Context);
  5. }

  相关的解析方法

  1. public static void TrySetUserInfo(HttpContext context)
  2. {
  3. if (context == null)
  4. throw new ArgumentNullException("context");
  5. // 1. 读登录Cookie
  6. HttpCookie cookie = context.Request.Cookies[FormsAuthentication.FormsCookieName];
  7. if (cookie == null || string.IsNullOrEmpty(cookie.Value))
  8. return;
  9. try
  10. {
  11. TUserData userData = null;
  12. // 2. 解密Cookie值,获取FormsAuthenticationTicket对象
  13. FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
  14. if (ticket != null && string.IsNullOrEmpty(ticket.UserData) == false)
  15. {
  16. // 3. 还原用户数据
  17. userData = JsonConvert.DeserializeObject<TUserData>(ticket.UserData);
  18. }
  19. if (ticket != null && userData != null)
  20. {
  21. // 4. 构造我们的UserFormsPrincipal实例,重新给context.User赋值。
  22. context.User = new UserFormsPrincipal<TUserData>(ticket, userData);
  23. }
  24. }
  25. catch { /* 有异常也不要抛出,防止攻击者试探。 */ }
  26. }

  3.自定义授权Attribute

  1. public class RoleAuthorizeAttribute : AuthorizeAttribute
  2. {
  3. public override void OnAuthorization(AuthorizationContext filterContext)
  4. {
  5. var isAuth = false;
  6. if (!filterContext.RequestContext.HttpContext.Request.IsAuthenticated)
  7. {
  8. isAuth = false;
  9. }
  10. else
  11. {
  12. if (filterContext.RequestContext.HttpContext.User.Identity != null)
  13. {
  14. IList<Permission> pList = null;
  15. var roleService = new UserServer("DefaultConnection");
  16. var actionDescriptor = filterContext.ActionDescriptor;
  17. var controllerDescriptor = actionDescriptor.ControllerDescriptor;
  18. var controller = controllerDescriptor.ControllerName;
  19. var action = actionDescriptor.ActionName;
  20. var ticket = (filterContext.RequestContext.HttpContext.User.Identity as FormsIdentity).Ticket;
  21. var userData = (filterContext.RequestContext.HttpContext.User as UserFormsPrincipal<UserInfo>).UserData;
  22. string perListKey = string.Format("userPermission_{0}", userData.RoleId);
  23. var cache = HttpRuntime.Cache.Get(perListKey) as List<Permission>;
  24. if (cache != null)
  25. {
  26. pList = cache;
  27. }
  28.  
  29. if (pList != null)
  30. {
  31. isAuth = pList.Any(x => x.CName.ToLower() == controller.ToLower() && x.AName.ToLower() == action.ToLower());
  32. }
  33. }
  34. }
  35. if (!isAuth)
  36. {
  37. filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Home", action = "Index", returnUrl = filterContext.HttpContext.Request.Url, returnMessage = "您无权查看." }));
  38. return;
  39. }
  40. else
  41. {
  42. base.OnAuthorization(filterContext);
  43. }
  44. }
  45. }

  4.Web.Config 在System.Web下新增配节

  1. <authentication mode="Forms">
  2. <forms name="LoginCookieName" loginUrl="~/Home/Index"></forms>
  3. </authentication>

三、实现细粒度权限控制

  1.构造BaseController 所有需要权限认证的Controller 都需要从此进行继承

  1. public class BaseController : Controller
  2. {
  3. public BaseController()
  4. {
  5. var pList = new List<Permission>();
  6. if (System.Web.HttpContext.Current != null && System.Web.HttpContext.Current.User.Identity.IsAuthenticated)
  7. {
  8. var ticket = (System.Web.HttpContext.Current.User.Identity as FormsIdentity).Ticket;
  9. var userData = (System.Web.HttpContext.Current.User as UserFormsPrincipal<UserInfo>).UserData;
  10. string perListKey = string.Format("userPermission_{0}", userData.RoleId);
  11. pList = HttpRuntime.Cache.Get(perListKey) as List<Permission>;
  12. }
  13. ViewBag.PerList = pList;
  14.  
  15. }
  16. }

  2._Layout.cshtml中获取权限信息并对主菜单进行权限控制

  1. @using FormAuth.Models;
  2. @using FormAuth.Utils;
  3. @{
  4. var pList = ViewBag.PerList as List<Permission>;
  5. }
  6. <!DOCTYPE html>
  7. <html>
  8. <head>
  9. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  10. <meta charset="utf-8" />
  11. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  12. <title>@ViewBag.Title - 我的 ASP.NET 应用程序</title>
  13. @Styles.Render("~/Content/css")
  14. @Scripts.Render("~/bundles/modernizr")
  15. </head>
  16. <body>
  17. <div class="navbar navbar-inverse navbar-fixed-top">
  18. <div class="container">
  19. <div class="navbar-header">
  20. <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
  21. <span class="icon-bar"></span>
  22. <span class="icon-bar"></span>
  23. <span class="icon-bar"></span>
  24. </button>
  25. @Html.ActionLink("大思无疆", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
  26. </div>
  27. <div class="navbar-collapse collapse">
  28. <ul class="nav navbar-nav">
  29. @if (pList != null)
  30. {
  31. if (pList.FirstOrDefault(m => m.CName.ToLower() == "hello") != null)
  32. {
  33. <li>@Html.ActionLink("你好", "Index", "Hello")</li>
  34. }
  35. if (pList.FirstOrDefault(m => m.CName.ToLower() == "world") != null)
  36. {
  37. <li>@Html.ActionLink("世界", "Index", "world")</li>
  38. }
  39. if (pList.FirstOrDefault(m => m.CName.ToLower() == "good") != null)
  40. {
  41. <li>@Html.ActionLink("棒棒哒", "Index", "good")</li>
  42. }
  43. }
  44.  
  45. </ul>
  46. </div>
  47. </div>
  48. </div>
  49. <div class="container body-content">
  50. @RenderBody()
  51. <hr />
  52. <footer>
  53. <p>&copy; @DateTime.Now.Year - 我的 ASP.NET 应用程序</p>
  54. </footer>
  55. </div>
  56.  
  57. @Scripts.Render("~/bundles/jquery")
  58. @Scripts.Render("~/bundles/bootstrap")
  59. @RenderSection("scripts", required: false)
  60. </body>
  61. </html>

  3.对Action根据权限信息进行显示

  1. @using FormAuth.Models;
  2. @{
  3. ViewBag.Title = "Index";
  4. var perList = ViewBag.PerList as List<Permission>;
  5. }
  6.  
  7. <h2>Hello->Index</h2>
  8. <div>
  9. <ul >
  10. @if (perList != null)
  11. {
  12. var helloList = perList.Where(m => m.CName.ToLower() == "hello");
  13. foreach (var item in helloList)
  14. {
  15. @Html.ActionLink(item.ActCnName,item.AName)
  16. }
  17. }
  18. </ul>
  19. </div>

  Action的权限已经在 2.3节已进行验证

项目github地址:https://github.com/GYY2046/FormAuth

注意事项:项目使用VS2017 数据库为Local DB 数据库的连接字符串为绝对路径注意修改!

如有错误欢迎指正。

ASP.NET MVC5 Forms登陆+权限控制(控制到Action)的更多相关文章

  1. Nginx访问控制_登陆权限的控制(http_auth_basic_module)

    Nginx提供HTTP的Basic Auth功能,配置了Basic Auth之后,需要输入正确的用户名和密码之后才能正确的访问网站. 我们使用htpasswd来生成密码信息,首先要安装httpd-to ...

  2. Asp.Net Core 2.0 项目实战(11) 基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级

    1.权限管理 权限管理的基本定义:百度百科. 基于<Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员.后台管理员同时登录>我们做过了登录认证, ...

  3. asp.net core根据用户权限控制页面元素的显示

    asp.net core根据用户权限控制页面元素的显示 Intro 在 web 应用中我们经常需要根据用户的不同允许用户访问不同的资源,显示不同的内容,之前做了一个 AccessControlHelp ...

  4. ASP.NET -- WebForm -- Cookie的使用 应用程序权限设计 权限设计文章汇总 asp.net后台管理系统-登陆模块-是否自动登陆 C# 读写文件摘要

    ASP.NET -- WebForm -- Cookie的使用 ASP.NET -- WebForm --  Cookie的使用 Cookie是存在浏览器内存或磁盘上. 1. Test3.aspx文件 ...

  5. wex5 教程 之 图文讲解 全局可观察变量与登陆状态全局控制

    一 先说说,这两个概念是什么意思 全局可观察变量?没听说过,只听过全局变量,那你out了,因为我要充分发挥绑定技术来控制页面部局,组件的隐藏与显示,文字内容,样式改变.看我博文大家知道,我想用绑定技术 ...

  6. ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目

    ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml)   我们都知道在使用WebApi的时候Controller会自动将Action的返回值自动进行各种序列化处理(序列化为 ...

  7. mysql的root的权限被控制无法授权

    一.环境: MariaDB [(none)]> select version(); +----------------+ | version()      | +---------------- ...

  8. 拍照权限,GPS权限的控制

    最近项目中会遇到一些手机用户权限的问题,从网上百度了一下,发现有一些方法不能解决判断用户权限的是否开关,下面我就介绍两种权限的判断 1 拍照的权限控制 public static boolean is ...

  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)

    开发工具:VS2015(2012以上)+SQL2008R2以上数据库  您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB  升级后界面效果如下: 任务调度系统界面 http: ...

随机推荐

  1. java中四种操作xml方式的比较

    1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息. ...

  2. 简单http代理服务器搭建

    1. yum install squid2. vi /etc/squid/squid.conf 将http_access deny all 中deny 改为allow,http_port后面的是端口号 ...

  3. 云主机和vps的区别

    云主机和vps的区别   近年来,IT行业开始热衷于各种云概念,而云主机就是其中之一,并且有越来越热之势.对普通用户而言,可能不太清楚云主机和VPS的区别,下面我们就来说说云主机和VPS到底有什么不同 ...

  4. Vue之七导航守卫

    { path:'/',component:Recommend,beforeEnter: (to, from, next) => { console.log(to); ajax('get','/a ...

  5. MYSQL数据库学习十三 使用MySQL常用函数

    13.1 字符串函数 对于针对字符串位置的操作,第一个位置被标记为1. 函数 功能 CONCAT(str1,str2...strn) 连接字符串str1.str2....strn INSERT(str ...

  6. Oracle/Hive/Impala SQL比较1

    5 Function      指数据库内置的function,不讨论UDF.另外,操作符都不比较了,区别不大.   5.1 数学函数 功能 Oracle Hive Impala ABS 绝对值,有 ...

  7. 数据库 --> 8种NoSQL数据库对比

    8 种 NoSQL 数据库对比 NoSQL是一项全新的数据库革命性运动,NoSQL的拥护者们提倡运用非关系型的数据存储.现今的计算机体系结构在数据存储方面要求具备庞大的水平扩展性,而NoSQL致力于改 ...

  8. php项目中常用的log日志记录方法

    function log_result($str) { if (LOG_WRITEOUT == 1) { $fp = fopen ( "log.txt", "a+&quo ...

  9. Java基础学习笔记二十二 网络编程

    络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和通信的规则 ...

  10. C#基础(二)拆箱与装箱,循环与选择结构,枚举

    一.装箱和拆箱 装箱是将值类型转换为引用类型 eg: Int a=5; Object  o=a; 拆箱是将引用类型转换为值类型 eg: Int a=5; Object  o=a; Int b=(int ...