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.

Foi útil?

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á.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top