本文转自:http://www.cnblogs.com/jaxu/p/3698377.html

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. 1,
  43. admin.id.ToString(),
  44. DateTime.Now,
  45. DateTime.Now.AddMinutes(60),
  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 = -1;
  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的问题

    ASP.NET中使用Forms身份认证常见的做法如下: 1. 网站根目录下的Web.config添加authentication节点 <authentication mode="For ...

  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. php 条件查询和多条件查询

    条件循环 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  2. p168习题

  3. 记C语言浮点数运算处理 "坑" 一则

    看一小段C语言程序: int main() { float x = 1.3; x = x - (int)x; ); ; } 在你心目中, 变量 I 是怎样的结果? 如果你理所当然地认为是3的话, 那么 ...

  4. 兼容古董级IE小结

    IE6已经死亡,当然7,8,9,10也挂掉了.微软对IE11更下了狠手,对其停止了更新.以为前端就可以安安心心地写代码了.可是就是有些顽固分子,竟然用的还是IE6,尊崇客户至上的原则,就恶心着给他兼容 ...

  5. ListView系列(七)——Adapter内的onItemClick监听器四个arg参数 (转)

    举个例子你会理解的更快:X, Y两个listview,X里有1,2,3,4这4个item,Y里有a,b,c,d这4个item.如果你点了b这个item.如下: public void onItemCl ...

  6. 【转】Hadoop集群添加磁盘步骤

    转自:http://blog.csdn.net/huyuxiang999/article/details/17691405 一.实验环境 : 1.硬件:3台DELL服务器,CPU:2.27GHz*16 ...

  7. rdd.toDebugString

    rdd.toDebugString 是个好东西,可以输出你的RDD的组成

  8. 解决Windows 10下Wireshark运行问题

    解决Windows 10下Wireshark运行问题在Windows 10下,安装Wireshark时候,提示WinPcap不被系统系统支持.这是由于最新版的WinPcap 4.1.3只支持到Wind ...

  9. 安卓智能手持POS打印票据 扫描盘点移动开单软件/无线开单系统/PDA移动开单软件

    移动开单手持机,它通过WIFI或者GPRS连接并访问电脑数据,实现移动扫描开单,数据同步上传等功能.方便.实用,大大提高工作效率!安卓智能手持POS是一套适合大酒店.咖啡馆..洗衣店.按摩洗浴,商场等 ...

  10. 哈希表--HashSet<T>

    .Net3.5之后出现了HashSet<T>,硬翻译过来就是“哈希集合”,跟“哈希”两字挂钩说明这种集合的内部实现用到了哈希算法,用Reflector工具就可以发现,HashSet< ...