ASP.NET中使用Forms身份认证常见的做法如下:

1. 网站根目录下的Web.config添加authentication节点

  1. <authentication mode="Forms">
  2. <forms name="MyAuth" loginUrl="manager/Login.aspx" defaultUrl="manager/default.aspx" protection="All" timeout="60" />
  3. </authentication>

2. 在manager子目录下添加Web.config文件并加入下面的内容:

  1. <?xml version="1.0"?>
  2. <configuration>
  3. <system.web>
  4. <authorization>
  5. <allow roles="Admin" />
  6. <deny users="*" />
  7. </authorization>
  8. </system.web>
  9. </configuration>

  这样,用户在没有Forms认证的情况下访问manager子目录下的任何页面均会自动跳转到manager/Login.aspx页面。如果认证成功,则会默认回到manager/default.aspx页面。认证有效期为60分钟。

3. 添加认证代码。登录按钮中添加下面的代码:

  1. if (!snCheckCode.CheckSN(txt_ValidateCode.Text))
  2. {
  3. snCheckCode.Create();
  4. Utility.ShowMessage("校验码错误!");
  5. return;
  6. }
  7.  
  8. string strUserName = txt_Username.Text.Trim();
  9. string md5Pwd = Helper.MD5ForPHP(Helper.MD5ForPHP(txt_Password.Text));
  10. lc_admin admin = null;
  11. bool logined = false;
  12.  
  13. using (var context = new dbEntities())
  14. {
  15. admin = context.tb_admin.Where(n => n.username == strUserName).FirstOrDefault();
  16.  
  17. if (admin != null)
  18. {
  19. if (admin.checkadmin != "true")
  20. {
  21. snCheckCode.Create();
  22. Utility.ShowMessage("抱歉,该账号被禁止登录!");
  23. return;
  24. }
  25.  
  26. if (admin.password == md5Pwd)
  27. {
  28. // Update Admin Info
  29. admin.loginip = Request.UserHostAddress.ToString();
  30. admin.logintime = CndingUtility.DateTimeToUnixTimeStamp(DateTime.Now);
  31. context.SaveChanges();
  32.  
  33. logined = true;
  34. }
  35. }
  36. }
  37.  
  38. if (logined)
  39. {
  40. // Login
  41. FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
  42. ,
  43. admin.id.ToString(),
  44. DateTime.Now,
  45. DateTime.Now.AddMinutes(),
  46. false,
  47. "Admin",
  48. FormsAuthentication.FormsCookiePath
  49. );
  50. string hashTicket = FormsAuthentication.Encrypt(ticket);
  51. HttpCookie userCookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashTicket);
  52. HttpContext.Current.Response.Cookies.Add(userCookie);
  53.  
  54. if (Request["ReturnUrl"] != null)
  55. {
  56. Response.Redirect(HttpUtility.HtmlDecode(Request["ReturnUrl"]));
  57. }
  58. else
  59. {
  60. Response.Redirect("/manager/default.aspx");
  61. }
  62. }
  63. else
  64. {
  65. snCheckCode.Create();
  66. CndingUtility.ShowMessage("用户名或密码不正确!");
  67. }

MD5加密代码:

  1. public static string MD5ForPHP(string stringToHash)
  2. {
  3. var md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
  4. byte[] emailBytes = Encoding.UTF8.GetBytes(stringToHash.ToLower());
  5. byte[] hashedEmailBytes = md5.ComputeHash(emailBytes);
  6. StringBuilder sb = new StringBuilder();
  7. foreach (var b in hashedEmailBytes)
  8. {
  9. sb.Append(b.ToString("x2").ToLower());
  10. }
  11. return sb.ToString();
  12. }

  认证成功后默认会将用户登录信息以Cookie的形式存放到客户端,有效期为60分钟。UserData被设置为用户的角色,在判断用户是否登录时会用到。如下面的代码:

  1. if (HttpContext.Current.User.Identity.IsAuthenticated)
  2. {
  3. int adminId = -;
  4. FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity;
  5. FormsAuthenticationTicket ticket = identity.Ticket;
  6. string userData = ticket.UserData;
  7. if (userData == "Admin")
  8. {
  9. // To do something
  10. }
  11. }

  上述代码在Visual Studio中运行一切正常!但是将网站发布到服务器的IIS (可能会是较低版本的IIS,如IIS 6)后,发现登录功能异常。输入用户名和密码后点击登录按钮,页面postback但并不能正确跳转,尝试手动访问受保护的页面会被自动跳转回登录页面。更奇怪的是该问题只出现在IE11浏览器上,尝试用Firefox或Chrome访问登录功能运行正常。初步怀疑是IIS设置的问题,可是IIS 6上并没有与Cookie相关的设置,好像记得IIS 7上倒是有这个设置。但因为只有IE 11存在该问题,所以可以否定代码本身存在任何问题。

  此外,还尝试了降低IE 11的安全级别,重新安装服务器上的.net framework以及下载最新的补丁等等,均不能解决问题。后来发现其实只需要简单修改Web.config中authentication节点的设置就可以了,给forms添加cookieless="UseCookies"属性即可。

  1. <authentication mode="Forms">
  2. <forms name="MyAuth" cookieless="UseCookies" loginUrl="manager/Login.aspx" defaultUrl="manager/default.aspx" protection="All" timeout="60" />
  3. </authentication>

  用以明确告诉服务器使用Cookie来保存用户验证信息。问题解决!

IE11下Forms身份认证无法保存Cookie的问题的更多相关文章

  1. [转]IE11下Forms身份认证无法保存Cookie的问题

    本文转自:http://www.cnblogs.com/jaxu/p/3698377.html ASP.NET中使用Forms身份认证常见的做法如下: 1. 网站根目录下的Web.config添加au ...

  2. IE11下ASP.NET Forms身份认证无法保存Cookie的问题

    IE11下ASP.NET Forms身份认证无法保存Cookie的问题 折腾了三四天,今天才找到资料,解决了. 以下会转贴,还没来得及深究,先放着,有空再学习下. ASP.NET中使用Forms身份认 ...

  3. 细说ASP.NET Forms身份认证

    阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份 ...

  4. ASP.NET Forms身份认证详解

    ASP.NET身份认证基础 在开始今天的内容之前,我想有二个最基础的问题首先要明确: 1. 如何判断当前请求是一个已登录用户发起的? 2. 如何获取当前登录用户的登录名? 在标准的ASP.NET身份认 ...

  5. 细说ASP.NET Forms身份认证 别人写的不过很透彻就转来了以后用时再看

    阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份 ...

  6. Forms身份认证

    引言 大家都知道Http是无状态的协议,所以访问一个url,你并不能知道用户在之前是否已经登陆过.但是许多业务上的逻辑又离不开user的信息,这个时候就可以借助身份认证来记录当前user的登录状态.这 ...

  7. 权限管理学习 一、ASP.NET Forms身份认证

    说明:本文示例使用的VS2017和MVC5. 系统无论大小.牛逼或屌丝,一般都离不开注册.登录.那么接下来我们就来分析下用户身份认证. 简单实现登录.注销 以前在学习.net的时候不知道什么Forms ...

  8. 【转】权限管理学习 一、ASP.NET Forms身份认证

    [转]权限管理学习 一.ASP.NET Forms身份认证 说明:本文示例使用的VS2017和MVC5. 系统无论大小.牛逼或屌丝,一般都离不开注册.登录.那么接下来我们就来分析下用户身份认证. 简单 ...

  9. 简单的ASP.NET Forms身份认证

    读了几篇牛人的此方面的文章,自己也动手做了一下,就想有必要总结一下.当然我的文章质量自然不能与人家相比,只是写给从没有接触过这个知识点的朋友. 网站的身份认证我以前只知道session,偶然发现一些牛 ...

随机推荐

  1. VC++ 中简单操作MP3音乐的方法,小结

    #include <windows.h> #include <stdio.h> #include <mmsystem.h> #include <shellap ...

  2. PS 制作复印件及盖章效果

    对要处理的部分选定  1.执行 滤镜--杂色--添加杂色 2.执行 滤镜--模糊--高斯模糊 3.ctrl+L 执行 色阶 调整为 满意的效果  4.最后添加想要的颜色 图像--调整--渐变映射 关键 ...

  3. python变量——黑板客老师课程学习

    1.和C++.Java的区别: 动态类型:不需要声明a的类型. a=34 type(a) <type  ‘int’> 一切皆对象: 4 2.数字: 自动转换类型:a=34  A=3.14 ...

  4. spi_flash

    http://blog.chinaunix.net/uid-27406766-id-3384699.html

  5. [python] defaultdict

    import collections s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] # defaul ...

  6. Servlet 利用Cookie实现一周内不重复登录

    import java.io.IOException;import java.io.PrintWriter; import javax.servlet.ServletException;import ...

  7. 使用max() 函数

    /********************************* 代码功能:使用串口输出a和b的最大值 使用函数:max(a,b); 创作时间:2016*11*04 作者邮箱:jikexianfe ...

  8. SQL数据库完全复制

    很少摸 Windows 环境下的东西,最近被个 MS SQL Server 的数据库搞得头大.实在不像 MySQL 那样用起来轻车熟路, OrZ ... 本来以为企业管理器里面既然提供了 DTS 数据 ...

  9. mysql提示2002错误的解决方法

    前两天,负责的一个项目出现问题,总是提示"SQLSTATE[HY000] [2002] 由于目标计算机积极拒绝,无法连接",由于负责服务器的同事联系不到,我无法登陆服务器查看原因, ...

  10. Training Deep Neural Networks

    http://handong1587.github.io/deep_learning/2015/10/09/training-dnn.html  //转载于 Training Deep Neural ...