欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Forms身份认证在IE11下无法保存Cookie的问题

程序员文章站 2024-02-26 09:09:04
asp.net中使用forms身份认证常见的做法如下: 1. 网站根目录下的web.config添加authentication节点 复制代码 代码如下:
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来保存用户验证信息。问题解决!