Pin*_*ong 7 .net c# asp.net forms-authentication
由于表格身份验证Cookie冲突,我的项目更新了表单身份验证会话.
详细说明:
用户登录后,会创建一个表单身份验证cookie(FACookieA),并对其进行身份验证.但是,在更新cookie时,会创建第二个表单auth cookie(FACookieB),并且不会续订FACookieA.在FACookieA中的到期时间之后,用户被重定向到页面请求上的登录页面,即使它在FACookieB中的到期时间之前.
生成的cookie:
请注意,两个cookie都具有相同的名称.
FACookieA:
name: FormsAuth
domain: .formsauth.com
Run Code Online (Sandbox Code Playgroud)
请注意"." 由.NET预先附加,"formsauth.com"来自Forms Authentication Ticket部分
FACookieB:
name: FormsAuth
host: a.formsauth.com
Run Code Online (Sandbox Code Playgroud)
请注意,cookie使用"host",而不是域,"a.formsauth.com"基于当前请求url域.
项目网址测试:
a.formsauth.com
Run Code Online (Sandbox Code Playgroud)
Web.config文件:
<forms loginUrl="~/Account/Login.aspx" name="FormsAuth"/>
Run Code Online (Sandbox Code Playgroud)
码
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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题:
1)如何生成一个表单auth cookie,以便用户可以更新表单auth session并且不会被注销?
注意事项:
1)项目需要支持多种语言,可能的域格式如下:
a.formsauth.com
a.en.formsauth.com
a.us.formsauth.com
Run Code Online (Sandbox Code Playgroud)
和
b.formsauth.com
b.en.formsauth.com
b.us.formsauth.com
Run Code Online (Sandbox Code Playgroud)
因此,我无法以声明方式设置Forms元素的domain属性.由于两组域无法共享cookie,因此允许在一组内共享cookie.这是相同的代码库用于具有不同域的不同应用程序.但是一组域可以共享cookie.
2)默认的内置FormsAuthenticationModule更新用户会话cookie,这就是我无法控制cookie中域的原因.请注意,FormsAuthenticationTicket用于在使用登录时创建cookie,如上所示.
任何的想法?
代码的逻辑不是很清楚,不清楚为什么要尝试替换cookie。)
不过我猜测重定向是在新 cookie 注册之前发生的。
Response.Cookies.Remove(cookie.Name);
Run Code Online (Sandbox Code Playgroud)
在此处添加代码以在尝试添加其他 cookie 之前检查 cookie 是否已被删除
Response.Cookies.Add(cookie);
Run Code Online (Sandbox Code Playgroud)
在此处添加代码以确保在重定向之前浏览器已注册 cookie(?)