Forms Cookie de autenticação parece parar de funcionar
-
06-07-2019 - |
Pergunta
Quero ter funcionalidade no meu aplicativo que permita que um usuário verifique se eles desejam permanecer registrados indefinidamente (definindo arbitrariamente a expiração do cookie daqui a 3 meses).
O código que tenho para lidar com isso é
private static HttpCookie GetFormsAuthenticationCookie(string userNameResponse,
bool persistCookie)
{
var cookie = FormsAuthentication.GetAuthCookie(userNameResponse, persistCookie);
if (persistCookie)
cookie.Expires = DateTime.Now.AddMonths(3);
return cookie;
}
private void LoginUser(string userNameResponse, bool PersistCookie)
{
Response.Cookies.Add(GetFormsAuthenticationCookie(userNameResponse, PersistCookie));
string navigateAfterUrl = FormsAuthentication.GetRedirectUrl(userNameResponse,
PersistCookie);
Response.Redirect(navigateAfterUrl);
}
No entanto, em algum momento mais tarde, quando volto ao site, preciso fazer o login novamente. Verifiquei que o cookie volta com a minha data de validade e que ele não está definido como um cookie de sessão (também testado com o navegador de fechamento/reabertura e o cookie ainda existe). Meu único pensamento é que isso tem algo a ver quando o ASP.NET expira a sessão.
Eu tenho uma configuração específica da chave da máquina na minha web.config, então o mesmo biscoito não deve funcionar se o IIS for reiniciado etc? Alguém tem alguma sugestão sobre o que poderia estar causando isso ou pelo menos sobre como rastrear isso ainda mais, pois não consigo pensar em mais nada para fazer.
Solução
Quando você liga para o GetAuthcookie Método a FormSauthenticationTicket é criado com um tempo limite dado pelo Tempo esgotado Propriedade em web.config. Portanto, certifique -se de defini -lo corretamente:
<authentication mode="Forms">
<forms
loginUrl="/someloginUrl"
requireSSL="true"
protection="All"
// This is the setting you are looking for! (it's in seconds)
timeout="120"
domain="example.com"
slidingExpiration="false"
name="cookieName" />
</authentication>
Depois que o bilhete é criptografado, ele é usado como um valor para o cookie. Quando você define o Expira Propriedade do seu cookie a um determinado valor que indica que ele será persistido no computador cliente para o período determinado. Em seguida, a cada solicitação o ASP.NET RUNDTION verificará a presença do cookie, tentará descriptografar o valor e obter o ticket. Em seguida, ele verificará se o ticket ainda é válido usando a propriedade Timeout; portanto, se você tiver um pequeno tempo limite, não importa que seu cookie ainda seja transmitido, o ticket não será mais válido e a autenticação falhará.