[转]IE11下Forms身份认证无法保存Cookie的问题
本文转自:http://www.cnblogs.com/jaxu/p/3698377.html
ASP.NET中使用Forms身份认证常见的做法如下:
1. 网站根目录下的Web.config添加authentication节点
- <authentication mode="Forms">
- <forms name="MyAuth" loginUrl="manager/Login.aspx" defaultUrl="manager/default.aspx" protection="All" timeout="60" />
- </authentication>
2. 在manager子目录下添加Web.config文件并加入下面的内容:

- <?xml version="1.0"?>
- <configuration>
- <system.web>
- <authorization>
- <allow roles="Admin" />
- <deny users="*" />
- </authorization>
- </system.web>
- </configuration>

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

- if (!snCheckCode.CheckSN(txt_ValidateCode.Text))
- {
- snCheckCode.Create();
- Utility.ShowMessage("校验码错误!");
- return;
- }
- string strUserName = txt_Username.Text.Trim();
- string md5Pwd = Helper.MD5ForPHP(Helper.MD5ForPHP(txt_Password.Text));
- lc_admin admin = null;
- bool logined = false;
- using (var context = new dbEntities())
- {
- admin = context.tb_admin.Where(n => n.username == strUserName).FirstOrDefault();
- if (admin != null)
- {
- if (admin.checkadmin != "true")
- {
- snCheckCode.Create();
- Utility.ShowMessage("抱歉,该账号被禁止登录!");
- return;
- }
- if (admin.password == md5Pwd)
- {
- // Update Admin Info
- admin.loginip = Request.UserHostAddress.ToString();
- admin.logintime = CndingUtility.DateTimeToUnixTimeStamp(DateTime.Now);
- context.SaveChanges();
- logined = true;
- }
- }
- }
- if (logined)
- {
- // Login
- FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
- 1,
- admin.id.ToString(),
- DateTime.Now,
- DateTime.Now.AddMinutes(60),
- false,
- "Admin",
- FormsAuthentication.FormsCookiePath
- );
- string hashTicket = FormsAuthentication.Encrypt(ticket);
- HttpCookie userCookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashTicket);
- HttpContext.Current.Response.Cookies.Add(userCookie);
- if (Request["ReturnUrl"] != null)
- {
- Response.Redirect(HttpUtility.HtmlDecode(Request["ReturnUrl"]));
- }
- else
- {
- Response.Redirect("/manager/default.aspx");
- }
- }
- else
- {
- snCheckCode.Create();
- CndingUtility.ShowMessage("用户名或密码不正确!");
- }

MD5加密代码:

- public static string MD5ForPHP(string stringToHash)
- {
- var md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
- byte[] emailBytes = Encoding.UTF8.GetBytes(stringToHash.ToLower());
- byte[] hashedEmailBytes = md5.ComputeHash(emailBytes);
- StringBuilder sb = new StringBuilder();
- foreach (var b in hashedEmailBytes)
- {
- sb.Append(b.ToString("x2").ToLower());
- }
- return sb.ToString();
- }

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

- if (HttpContext.Current.User.Identity.IsAuthenticated)
- {
- int adminId = -1;
- FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity;
- FormsAuthenticationTicket ticket = identity.Ticket;
- string userData = ticket.UserData;
- if (userData == "Admin")
- {
- // To do something
- }
- }

上述代码在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"属性即可。
- <authentication mode="Forms">
- <forms name="MyAuth" cookieless="UseCookies" loginUrl="manager/Login.aspx" defaultUrl="manager/default.aspx" protection="All" timeout="60" />
- </authentication>
用以明确告诉服务器使用Cookie来保存用户验证信息。问题解决!
[转]IE11下Forms身份认证无法保存Cookie的问题的更多相关文章
- IE11下Forms身份认证无法保存Cookie的问题
ASP.NET中使用Forms身份认证常见的做法如下: 1. 网站根目录下的Web.config添加authentication节点 <authentication mode="For ...
- IE11下ASP.NET Forms身份认证无法保存Cookie的问题
IE11下ASP.NET Forms身份认证无法保存Cookie的问题 折腾了三四天,今天才找到资料,解决了. 以下会转贴,还没来得及深究,先放着,有空再学习下. ASP.NET中使用Forms身份认 ...
- 细说ASP.NET Forms身份认证
阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份 ...
- ASP.NET Forms身份认证详解
ASP.NET身份认证基础 在开始今天的内容之前,我想有二个最基础的问题首先要明确: 1. 如何判断当前请求是一个已登录用户发起的? 2. 如何获取当前登录用户的登录名? 在标准的ASP.NET身份认 ...
- 细说ASP.NET Forms身份认证 别人写的不过很透彻就转来了以后用时再看
阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份 ...
- Forms身份认证
引言 大家都知道Http是无状态的协议,所以访问一个url,你并不能知道用户在之前是否已经登陆过.但是许多业务上的逻辑又离不开user的信息,这个时候就可以借助身份认证来记录当前user的登录状态.这 ...
- 权限管理学习 一、ASP.NET Forms身份认证
说明:本文示例使用的VS2017和MVC5. 系统无论大小.牛逼或屌丝,一般都离不开注册.登录.那么接下来我们就来分析下用户身份认证. 简单实现登录.注销 以前在学习.net的时候不知道什么Forms ...
- 【转】权限管理学习 一、ASP.NET Forms身份认证
[转]权限管理学习 一.ASP.NET Forms身份认证 说明:本文示例使用的VS2017和MVC5. 系统无论大小.牛逼或屌丝,一般都离不开注册.登录.那么接下来我们就来分析下用户身份认证. 简单 ...
- 简单的ASP.NET Forms身份认证
读了几篇牛人的此方面的文章,自己也动手做了一下,就想有必要总结一下.当然我的文章质量自然不能与人家相比,只是写给从没有接触过这个知识点的朋友. 网站的身份认证我以前只知道session,偶然发现一些牛 ...
随机推荐
- php 条件查询和多条件查询
条件循环 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- p168习题
- 记C语言浮点数运算处理 "坑" 一则
看一小段C语言程序: int main() { float x = 1.3; x = x - (int)x; ); ; } 在你心目中, 变量 I 是怎样的结果? 如果你理所当然地认为是3的话, 那么 ...
- 兼容古董级IE小结
IE6已经死亡,当然7,8,9,10也挂掉了.微软对IE11更下了狠手,对其停止了更新.以为前端就可以安安心心地写代码了.可是就是有些顽固分子,竟然用的还是IE6,尊崇客户至上的原则,就恶心着给他兼容 ...
- 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 ...
- 【转】Hadoop集群添加磁盘步骤
转自:http://blog.csdn.net/huyuxiang999/article/details/17691405 一.实验环境 : 1.硬件:3台DELL服务器,CPU:2.27GHz*16 ...
- rdd.toDebugString
rdd.toDebugString 是个好东西,可以输出你的RDD的组成
- 解决Windows 10下Wireshark运行问题
解决Windows 10下Wireshark运行问题在Windows 10下,安装Wireshark时候,提示WinPcap不被系统系统支持.这是由于最新版的WinPcap 4.1.3只支持到Wind ...
- 安卓智能手持POS打印票据 扫描盘点移动开单软件/无线开单系统/PDA移动开单软件
移动开单手持机,它通过WIFI或者GPRS连接并访问电脑数据,实现移动扫描开单,数据同步上传等功能.方便.实用,大大提高工作效率!安卓智能手持POS是一套适合大酒店.咖啡馆..洗衣店.按摩洗浴,商场等 ...
- 哈希表--HashSet<T>
.Net3.5之后出现了HashSet<T>,硬翻译过来就是“哈希集合”,跟“哈希”两字挂钩说明这种集合的内部实现用到了哈希算法,用Reflector工具就可以发现,HashSet< ...