由于 Forms Auth Cookie 冲突,我的项目在更新 Forms Authentication Session 时遇到问题。
详细说明:
用户登录后,将创建一个表单例份验证 cookie (FACookieA),并对其进行身份验证。但是,在更新 cookie 时,会创建第二个表单例份验证 cookie (FACookieB),而不会更新 FACookieA。在 FACookieA 中的过期时间之后,用户被重定向到页面请求的登录页面,即使它在 FACookieB 中的过期时间之前。
生成的 cookie:
请注意,两个 cookie 的名称相同。
FACookieA:
name: FormsAuth
domain: .formsauth.com
请注意“.”由 .NET 预先附加,“formsauth.com”来自 Forms Authentication Ticket 部分
FACookieB:
name: FormsAuth
host: a.formsauth.com
请注意 cookie 使用“主机”,而不是域,“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) 如何生成一个forms auth cookie,使用户可以更新forms auth session 并且不会被登出?
注意事项:
1) 项目需要支持多种语言,可能的域名格式如下:
a.formsauth.com
a.en.formsauth.com
a.us.formsauth.com
和
b.formsauth.com
b.en.formsauth.com
b.us.formsauth.com
因此,我无法以声明方式设置 Forms 元素的域属性。因为两组域不能共享cookie,所以允许在一组内共享cookie。也就是说,相同的代码库用于具有不同域的不同应用程序。但是一组域可以共享cookie。
2)默认内置的FormsAuthenticationModule更新用户 session cookie,这就是我无法控制cookie中的域的原因。请注意,FormsAuthenticationTicket 用于在使用登录时创建 cookie,如上所示。
有什么想法吗?
最佳答案
您不能混合使用同名的主机和域 cookie。为使这项工作正常进行,所有 cookie 都需要设置在顶级域中。
关于c# - 自定义表单例份验证的表单例份验证续订问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29833423/