IE11下ASP.NET Forms身份认证无法保存Cookie的问题
IE11下ASP.NET Forms身份认证无法保存Cookie的问题
折腾了三四天,今天才找到资料,解决了。
以下会转贴,还没来得及深究,先放着,有空再学习下。
- ASP.NET中使用Forms身份认证常见的做法如下:
- . 网站根目录下的Web.config添加authentication节点
- <authentication mode="Forms">
- <forms name="MyAuth" loginUrl="manager/Login.aspx" defaultUrl="manager/default.aspx" protection="All" timeout="" />
- </authentication>
- . 在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分钟。
- . 添加认证代码。登录按钮中添加下面的代码:
- 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 )后,发现登录功能异常。输入用户名和密码后点击登录按钮,页面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="" />
- </authentication>
- 用以明确告诉服务器使用Cookie来保存用户验证信息。问题解决!
IE11下ASP.NET Forms身份认证无法保存Cookie的问题的更多相关文章
- IE11下Forms身份认证无法保存Cookie的问题
ASP.NET中使用Forms身份认证常见的做法如下: 1. 网站根目录下的Web.config添加authentication节点 <authentication mode="For ...
- [转]IE11下Forms身份认证无法保存Cookie的问题
本文转自:http://www.cnblogs.com/jaxu/p/3698377.html ASP.NET中使用Forms身份认证常见的做法如下: 1. 网站根目录下的Web.config添加au ...
- 细说ASP.NET Forms身份认证
阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份 ...
- 简单的ASP.NET Forms身份认证
读了几篇牛人的此方面的文章,自己也动手做了一下,就想有必要总结一下.当然我的文章质量自然不能与人家相比,只是写给从没有接触过这个知识点的朋友. 网站的身份认证我以前只知道session,偶然发现一些牛 ...
- 【转】权限管理学习 一、ASP.NET Forms身份认证
[转]权限管理学习 一.ASP.NET Forms身份认证 说明:本文示例使用的VS2017和MVC5. 系统无论大小.牛逼或屌丝,一般都离不开注册.登录.那么接下来我们就来分析下用户身份认证. 简单 ...
- ASP.NET Forms身份认证详解
ASP.NET身份认证基础 在开始今天的内容之前,我想有二个最基础的问题首先要明确: 1. 如何判断当前请求是一个已登录用户发起的? 2. 如何获取当前登录用户的登录名? 在标准的ASP.NET身份认 ...
- 细说ASP.NET Forms身份认证 别人写的不过很透彻就转来了以后用时再看
阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份 ...
- 关于Asp.Net Forms身份认证
Asp.Net管道式的构建个我们提供了通过IHttpMoudle来订阅管线事件来达到干预HTTP请求的目的,Asp.Net的身份认证正是通过此种方式来对请求来执行身份认证的,这篇文章仅仅谈论Forms ...
- 权限管理学习 一、ASP.NET Forms身份认证
说明:本文示例使用的VS2017和MVC5. 系统无论大小.牛逼或屌丝,一般都离不开注册.登录.那么接下来我们就来分析下用户身份认证. 简单实现登录.注销 以前在学习.net的时候不知道什么Forms ...
随机推荐
- vi/vim使用进阶: 剑不离手 – quickfix
转载:http://easwy.com/blog/archives/advanced-vim-skills-quickfix-mode/ 本节所用命令的帮助入口: :help quickfix :he ...
- 小白日记4:kali渗透测试之被动信息收集(三)--Shodan、Google
搜索引擎 公司新闻动态 重要雇员信息 机密⽂文档 / 网络拓扑 用户名密码 目标系统软硬件技术架构一.Shodan Shodan只搜网络设备.很多设备并不应该接入互联网,却由于本地网络管理员的疏忽和懒 ...
- iOS之Xcode8 Auto Layout新特性
目录 1.Incrementally Adopting Auto Layout 2.Design and Runtime Constraints 3.NSGridView 4.Layout Feedb ...
- iOS “获取验证码”按钮的倒计时功能
iOS 的倒计时有多种实现细节,Cocoa Touch 为我们提供了 NSTimer 类和 GCD 的dispatch_source_set_timer方法去更加方便的使用计时器.我们也可以很容易的的 ...
- mongodb windows下的安装
(1)上mongodb的官网下载windows版本的mongo的安装包,安装包是绿色版的解压出来就可以直接使用. (2)将解压出来的bin文件夹复制到c:\mongoDB下(c:\mongoDB这个文 ...
- 魔方阵算法及C语言实现
1 魔方阵概念 填充的,每一行.每一列.对角线之和均相等的方阵,阶数n = 3,4,5….魔方阵也称为幻方阵. 例如三阶魔方阵为: 魔方阵有什么的规律呢? 魔方阵分为奇幻方和偶幻方.而偶幻方又分为是4 ...
- C#控制台程序 使用 Server.MapPath,
(1)添加引用 System.Web. (2)在类中填写 using System.Web 命名空间. (3)写法为: System.Web.HttpContext.Current.Server.Ma ...
- cogs 餐巾 461(贪心)
/*虽然这暴力剪了又剪 改了又改 还是初始的20分...*/ #include<iostream> #include<cstdio> #include<cstring&g ...
- c# 与 PHP中 SHA1加密结果不同解决方法
那天在调试API的时候,发现用c#写的SHA1加密出来的结果和PHP中sha1()出来的不一样,找了半天的原因后来才弄出来 在调试微信接口的时候大多的帮助文档都是提供的是PHP的方法,所以在.net中 ...
- CSE(Corrupted State Exceptions) 严重异常处理办法
原因分析 出现这个问题说明.NET版本至少是4.0,因为微软在.NET 4.0版本中更改了异常处理机制.微软认为catch(Exception)这种写法是不负责任的,程序员应该按照异常严重类别决定程序 ...