博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IE11下Forms身份认证无法保存Cookie的问题
阅读量:6994 次
发布时间:2019-06-27

本文共 3290 字,大约阅读时间需要 10 分钟。

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

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

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

  这样,用户在没有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"属性即可。

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

转载地址:http://hmivl.baihongyu.com/

你可能感兴趣的文章
如何利用CSS实现动画效果
查看>>
Python高级网络编程系列之第三篇
查看>>
图片水印工具类java
查看>>
Python基础3_基本数据类型,字符串,for循环
查看>>
vue 中使用 AJAX获取数据的方法
查看>>
JDBC简单范例
查看>>
Java反射得到属性的值和设置属性的值
查看>>
Linux查看系统版本命令
查看>>
从微博的改版谈网页重构——bigpipe中的页面构建优化
查看>>
layout蒙版
查看>>
Oracle12c多租户如何连接到CDB或PDB、CDB与PDB容器切换
查看>>
Open Xml 读取Excel中的图片
查看>>
(转)IOS 学习笔记 2015-03-23 如何获取IOS程序的系统信息
查看>>
ASSERT()是干什么用的
查看>>
<转>显示图片汇总
查看>>
Flexbox 布局
查看>>
一文搞定Redis高级特性与性能调优
查看>>
并发容器:CopyOnWrite详解以及在KafKa源码中的使用!
查看>>
Jenkins部署maven工程到tomcat简单实例
查看>>
【转载】js清空cookie
查看>>