ASP.NET Обновление FormsAuthenticationTicket - PullRequest
2 голосов
/ 21 сентября 2010

Когда пользователь входит на мой сайт, я создаю следующий запрос на аутентификацию:

// Create the authentication ticket
var authTicket = new FormsAuthenticationTicket(1, // Version
                    userName, // Username
                    DateTime.UtcNow,             // Creation
                    DateTime.UtcNow.AddMinutes(10080), // Expiration
                    createPersistentCookie, // Persistent
                    user.Role.RoleName + "|~|" + user.UserID + "|~|" + user.TimeZoneID); // Additional data

// Encrypt the ticket
var encTicket = FormsAuthentication.Encrypt(authTicket);

// Store the ticket in a cookie
HttpContext.Current.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket) { Expires = authTicket.Expiration });

Тогда в моем файле Global.asax.cs у меня есть следующее:

protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
    // Get the authentication cookie
    var authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];

    // If it exists then decrypt and setup the generic principal
    if (authCookie != null && !string.IsNullOrEmpty(authCookie.Value))
    {
        var ticket = FormsAuthentication.Decrypt(authCookie.Value);
        var id = new UserIdentity(ticket); // This class simply takes the value from the cookie and then sets the properties on the class for the role, user id and time zone id
        var principal = new GenericPrincipal(id, new string[] { id.RoleName });
        HttpContext.Current.User = principal;
    }
}

protected void Session_Start(object sender, EventArgs e)
{
    // If the user has been disabled then log them out
    if (Request.IsAuthenticated)
    {
        var user = _userRepository.Single(u => u.UserName == HttpContext.Current.User.Identity.Name);

        if (!user.Enabled)
            FormsAuthentication.SignOut();
    }
}

Пока все хорошо. У меня проблема в том, что если администратор меняет роль пользователя или часовой пояс, то в следующий раз, когда они возвращаются на сайт, его билет не обновляется (если он выбрал «Запомнить меня при входе в систему»).

Вот мои настройки аутентификации, если это помогает:

<authentication mode="Forms">
    <forms timeout="10080" slidingExpiration="true" />
</authentication>
<membership userIsOnlineTimeWindow="15" />

Я читал о slideExpiration, но, насколько я могу судить, это только увеличивает срок действия и не обновляет содержимое cookie. Буду очень признателен, если кто-нибудь сможет помочь. Спасибо

Ответы [ 2 ]

1 голос
/ 28 сентября 2010

Я просто изменил свой Session_Start на:

// If the user is disabled then log them out else update their ticket
if (Request.IsAuthenticated)
{
    var user = _userRepository.Single(u => u.UserName == HttpContext.Current.User.Identity.Name);   

    if (!user.Enabled)   
        FormsAuthentication.SignOut();   
    else
        RenewTicket(); // This calls the same code to create the cookie as used when logging in
}
0 голосов
/ 11 февраля 2015

Мое предложение будет сделать еще один файл cookie для запоминания. Таким образом, информация о сеансе может быть файлом cookie в памяти, а помните, что файл cookie может быть сохранен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...