我的项目由于Forms Auth Cookies的冲突而无法更新Forms Authentication Session。
详细描述:
用户登录后,会创建一个forms auth cookie(FACookieA),并进行身份验证。然而,在更新cookie时,会创建第二个forms auth cookie(FACookieB),并且不会更新FACookieA。在FACookieA到期时间之后请求页面时,用户将被重定向到登录页面,即使在FACookieB到期时间之前也是如此。
生成的cookies:
请注意,两个cookie具有相同的名称。
FACookieA:
name: FormsAuth
domain: .formsauth.com
请注意在.NET前添加的".","formsauth.com"来自Forms身份验证票证部分。
FACookieB:
name: FormsAuth
host: a.formsauth.com
请注意Cookie使用"host"而不是"domain","a.formsauth.com"基于当前请求的URL域。 已测试的项目URL:
a.formsauth.com
Web.config:
<forms loginUrl="~/Account/Login.aspx" name="FormsAuth"/>
代码
public partial class Account_Login : System.Web.UI.Page
{
protected void LoginButton_Click(object sender, EventArgs e)
{
if (Membership.ValidateUser(LoginUser.UserName.Trim(), LoginUser.Password.Trim()))
{
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1,
"username",
DateTime.Now,
DateTime.Now.AddMinutes(2),
false,
string.Empty
);
string encryptedTicket = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
cookie.Domain = "formsauth.com";
cookie.Path = FormsAuthentication.FormsCookiePath;
Response.Cookies.Remove(cookie.Name);
Response.Cookies.Add(cookie);
Response.Redirect("~/Account/ChangePassword.aspx"); //authenticated area
}else
{
Response.Write("Invalid UserID and Password");
}
}
}
问题:
1) 如何生成一个表单认证cookie,使用户可以更新表单认证会话而不会被注销?
注意事项:
1) 项目需要支持多种语言,可能的域格式如下:
a.formsauth.com
a.en.formsauth.com
a.us.formsauth.com
并且。
b.formsauth.com
b.en.formsauth.com
b.us.formsauth.com
因此,我无法在表单元素中声明性地设置域属性。因为两组域名不能共享cookie,只允许在一组域名内共享cookie。也就是说,同一代码库可用于具有不同域名的不同应用程序。但是一组域名可以共享cookie。
2)默认内置的FormsAuthenticationModule会更新用户会话cookie,这就是为什么我无法控制cookie中的域的原因。请注意,如上所示,FormsAuthenticationTicket用于创建cookie以供用户登录使用。
你有什么想法吗?
cookie.Domain = "formsauth.com";
? - Khanh TOslidingExpiration="true" cookieless="UseCookies" timeout="x"
添加到 web.config 中的<forms>
中?x
是用户在不活动一段时间后需要再次登录的分钟数。 - JW Lim