Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的表单验证票证过期得这么快?_C#_.net_Asp.net_Authentication_Forms Authentication - Fatal编程技术网

C# 为什么我的表单验证票证过期得这么快?

C# 为什么我的表单验证票证过期得这么快?,c#,.net,asp.net,authentication,forms-authentication,C#,.net,Asp.net,Authentication,Forms Authentication,我正在ASP.NET应用程序中使用窗体身份验证。我将FormsAuthenticationTicket配置为在1年内过期,但实际上在1小时左右后过期。我不明白为什么 以下是登录过程中涉及的所有代码: public static bool Login(int id) { try { string securityToken = UserHelper.AuthenticateUser(id); DateTime expiryDate = DateTi

我正在ASP.NET应用程序中使用窗体身份验证。我将
FormsAuthenticationTicket
配置为在1年内过期,但实际上在1小时左右后过期。我不明白为什么

以下是登录过程中涉及的所有代码:

public static bool Login(int id)
{
    try
    {
        string securityToken = UserHelper.AuthenticateUser(id);

        DateTime expiryDate = DateTime.Now.AddYears(1);
        FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
             1, id.ToString(), DateTime.Now, expiryDate, true,
             securityToken, FormsAuthentication.FormsCookiePath);

        string encryptedTicket = FormsAuthentication.Encrypt(ticket);
        HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
        cookie.Expires = expiryDate;

        HttpContext.Current.Response.Cookies.Add(cookie);

        return true;
    }
    catch
    {
        return false;
    }
}
Web.config:

<system.web>
    <machineKey validationKey="AutoGenerate"
    decryptionKey="AutoGenerate" validation="SHA1" />
    <compilation debug="true">
    <authentication mode="Forms">
        <forms loginUrl="~/Login.aspx" timeout="2880"/>
    </authentication>
...
SetPrincipal代码:

public static void SetPrincipal()
{
    ILivrePrincipal principal = null;
    FormsIdentity identity;
    UrlParameters urlParameters = UrlParametersHelper.GetUrlParameters(HttpContext.Current.Request);

    if (HttpContext.Current.Request.IsAuthenticated)
    {
        identity = (FormsIdentity)HttpContext.Current.User.Identity;

        User userProfile;
        urlParameters.SecurityToken = (((FormsIdentity)identity).Ticket).UserData;
        try
        {
            userProfile = UserHelper.GetUser(urlParameters.SecurityToken);
            UserHelper.UpdateLastActiveOn(userProfile);
            principal = new AuthenticatedPrincipal(identity, userProfile);
        }
        catch
        {
            //TODO: Log an exception
            FormsAuthentication.SignOut();
            principal = new AnonymousPrincipal(new GuestIdentity(), UserHelper.GetUser(null));
        }
    }
    else
    {
        principal = new AnonymousPrincipal(new GuestIdentity(), UserHelper.GetUser(null));
    }

    HttpContext.Current.User = principal;
}

我看代码没有任何问题。您使用的是什么浏览器,可能它不识别1年的到期日期?我会使用fiddler或类似工具查看响应头,并查看实际发送的内容。

我唯一能看到的非标准内容是,您正在将id.ToString()传递给FormsAuthenticationTicket构造函数。我通常在此参数中传递用户名。不确定这是否会产生影响,但值得一试。

您的应用程序中是否使用了其他可能导致超时的内容? 例如,在进程内会话状态过期时自动注销

我假设您的Global.asax中也有一些代码来处理经过身份验证的请求?

这可能会有所帮助

我猜饼干在票到期之前就过期了。上面的文章向您展示了调试的方法,看看是否确实如此。

这就是您的问题所在

<machineKey validationKey="AutoGenerate" 
            decryptionKey="AutoGenerate" 
            validation="SHA1"/>

ASP将在每次应用程序池回收时生成一个新的机器密钥。每小时都有可能发生

机器密钥用于加密和解密FormsAuthenticationCookie。如果它发生变化,浏览器上的cookie将不再有效。因此,系统会将您视为从未登录

尝试生成静态密钥并将其添加到配置文件中。应该是这样的:

<machineKey  
    validationKey="21F090935F6E49C2C797F69(snip)F1B72A7F0A281B"          
    decryptionKey="ABAA84D7EC4BB56D75D(snip)B8BF91CFCD64568A145BE59719F"
    validation="SHA1"
    decryption="AES"
/>


为自己生成一个密钥。

为什么有
timeout=“2880”
(指定2天)?@Gabe谢谢。我同意你的看法。这是一个错误,但仍然无法解释为什么我的登录会话将在大约一小时后过期。我发现任何浏览器都有问题,响应头是什么样子的?我同意首先要查看原始cookie/流量。Firefox与Firebug和Firecookie插件是一个很好的解决问题的方法(这就是我调试表单身份验证问题的方式)。我认为我没有使用任何会导致超时的东西。我添加了有关身份验证代码的更多信息。
<machineKey  
    validationKey="21F090935F6E49C2C797F69(snip)F1B72A7F0A281B"          
    decryptionKey="ABAA84D7EC4BB56D75D(snip)B8BF91CFCD64568A145BE59719F"
    validation="SHA1"
    decryption="AES"
/>