c# - 自定义表单例份验证的表单例份验证续订问题

标签 c# asp.net .net forms-authentication

由于 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/

相关文章:

Jquery ui 自动完成用 ID 填充隐藏字段

c# - 使用网络摄像头拍照是黑色输出[Unity3D]

asp.net - 如何通过 FORM 从 ASP.Net MVC 堆栈调用存储过程并在 json 中返回它们?

C# - 方法的类型签名与 PInvoke 不兼容。使用 MarshalDirectiveException

asp.net - 在混合 MVC/WebForms Web 应用程序中配置授权

.net - 使用 SpeechSynthesizer 使用 SpeechAudioFormatInfo 流式传输 TTS

c# - 如何将字节数组转换回文件并使用 C# 自动打开它?

c# - 在 StackExchange.Redis 中满足所有条件时交易失败

c# - 使用原始参数构造函数注册类型?

c# - 大对象堆分片