IE11下Forms身份认证无法保存Cookie的问题
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(
- ,
- admin.id.ToString(),
- DateTime.Now,
- DateTime.Now.AddMinutes(),
- 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 = -;
- 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的问题
本文转自:http://www.cnblogs.com/jaxu/p/3698377.html ASP.NET中使用Forms身份认证常见的做法如下: 1. 网站根目录下的Web.config添加au ...
- 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,偶然发现一些牛 ...
随机推荐
- VC++ 中简单操作MP3音乐的方法,小结
#include <windows.h> #include <stdio.h> #include <mmsystem.h> #include <shellap ...
- PS 制作复印件及盖章效果
对要处理的部分选定 1.执行 滤镜--杂色--添加杂色 2.执行 滤镜--模糊--高斯模糊 3.ctrl+L 执行 色阶 调整为 满意的效果 4.最后添加想要的颜色 图像--调整--渐变映射 关键 ...
- python变量——黑板客老师课程学习
1.和C++.Java的区别: 动态类型:不需要声明a的类型. a=34 type(a) <type ‘int’> 一切皆对象: 4 2.数字: 自动转换类型:a=34 A=3.14 ...
- spi_flash
http://blog.chinaunix.net/uid-27406766-id-3384699.html
- [python] defaultdict
import collections s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] # defaul ...
- Servlet 利用Cookie实现一周内不重复登录
import java.io.IOException;import java.io.PrintWriter; import javax.servlet.ServletException;import ...
- 使用max() 函数
/********************************* 代码功能:使用串口输出a和b的最大值 使用函数:max(a,b); 创作时间:2016*11*04 作者邮箱:jikexianfe ...
- SQL数据库完全复制
很少摸 Windows 环境下的东西,最近被个 MS SQL Server 的数据库搞得头大.实在不像 MySQL 那样用起来轻车熟路, OrZ ... 本来以为企业管理器里面既然提供了 DTS 数据 ...
- mysql提示2002错误的解决方法
前两天,负责的一个项目出现问题,总是提示"SQLSTATE[HY000] [2002] 由于目标计算机积极拒绝,无法连接",由于负责服务器的同事联系不到,我无法登陆服务器查看原因, ...
- Training Deep Neural Networks
http://handong1587.github.io/deep_learning/2015/10/09/training-dnn.html //转载于 Training Deep Neural ...