Persistent AuthCookie 已设置但被重定向到登录

Persistent AuthCookie is set but being redirected to login

我在使用持久性 AuthCookie 时遇到问题。验证和登录工作完美,如果我关闭浏览器并重新打开它,身份验证仍然有效,没有重定向到登录页面。 我不确定确切的时间是什么,但假设如果在不注销的情况下关闭浏览器并在 20 分钟后才重新打开它,即使在我使用 Web 开发人员工具检查时设置了 cookie,我也会被重定向到登录页面它的有效期是一个月后。

我在验证用户凭据后所做的就是

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

在我的 Web.Config 中,我将其设置为

<configuration>
    <system.web>
    ...
    <authentication mode="Forms">
        <forms cookieless="UseCookies" loginUrl="~/Utilizador/Login" name="SMOAuth" slidingExpiration="true" timeout="43829"/>
    </authentication>
    ...

还尝试按照建议 here 和其他一些地方对机器密钥进行硬编码,但没有效果

<machineKey validationKey="Validation_Key_Here" decryptionKey="Decrypt_Key_Here" validation="SHA1" decryption="AES"/>

我很难弄清楚这个问题

检查您的 IIS 设置。

1) 默认情况下,IIS 7(和 IIS 8,如果有内存的话)在运行时为每个应用程序池生成唯一的 encryption key。在运行时生成意味着每当应用程序池重新启动时都会重新生成密钥。这意味着在应用程序池重启之前生成的持久性 cookie 在应用程序池重启后不会被解密,用户将无法使用旧 cookie 进行身份验证,并将被带到登录页面。

2) IIS 默认 idle timeout - 20 分钟。这意味着如果应用程序在 20 分钟内没有收到单个请求,应用程序池将关闭。然后当一个请求进来时它会重新开始。

以上两个设置的组合可能导致您描述的行为。

PS。您可能还想检查应用程序事件日志 - 如果确实解密失败,您将在那里遇到异常 - "Unable to validate data"

行中的内容
//this line is NOT ENOUGH for "remember me" to work!!!
FormsAuthentication.SetAuthCookie(userName, true); //DOESN'T WORK!

//###########

//you have to save the "remember me" info inside the auth-ticket as well
//like this:

DateTime expires = DateTime.Now.AddDays(20); //remember for 20 days

//create the auth ticket
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
    userName,
    DateTime.Now,
    expires, // value of time out property
    true, // Value of IsPersistent property!!!
    String.Empty,
    FormsAuthentication.FormsCookiePath);

//now encrypt the auth-ticket
string encryptedTicket = FormsAuthentication.Encrypt(ticket);

//now save the ticket to a cookie
HttpCookie authCookie = new HttpCookie(
            FormsAuthentication.FormsCookieName,
            encryptedTicket);
authCookie.Expires = expires;

//feed the cookie to the browser
HttpContext.Current.Response.Cookies.Add(authCookie);