我在Asp.net的登录页面上遇到一个奇怪的问题,这个问题只发生在Safari上。
当用户被验证时,我从数据库中获取用户的名称(数据库中的字段是UTF8)并将其保存在cookie中。问题是,当用户的名字带有特殊字符时,我会被重定向到我来自的页面而不登录。例如“Moller”工作正常,用户登录但不是“Møller”。
同样这只发生在Safari上,当我在名字中有特殊字符时。无效的行是:Response.Cookies [“userInfo”] [“name”] = getNameFromUserid(userid);
这是我的代码:
string userid = validUserWithEmail(TextBoxEmail.Text, TextBoxPassword.Text);
if (userid != null) {
//VALID USER
Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(30);
Response.Cookies["userInfo"]["name"] = getNameFromUserid(userid);
FormsAuthentication.RedirectFromLoginPage(userid, CheckBoxPersistCookie.Checked);
}
else
{
//NOT A VALID USER SHOW A MESSAGE FOR THE USER OR SOMETHING
}
答案 0 :(得分:7)
Safari不会在其值中设置包含非ASCII字符的Cookie,而其他浏览器在显示非ASCII字符的方式上可能无法预测。对于任何浏览器的cookie值,也不允许使用分号,我建议使用UrlEncode / UrlDecode。
如果您只是编写cookie并且无法控制网站读取/显示要放入URLDecode的值,您还可以执行以下操作:
ckCookie.Value = (Server.HtmlEncode( strSpecialCharacters )).Replace(";","");
这将确保在cookie中设置完整字符串,Safari,Chrome,Firefox和IE仍然会识别html代码,即使没有;并且在读取时不需要解码。
有关Cookie规范的更长答案,请参阅:Allowed characters in cookies