Ошибка ASP.NET MVC FormsAuthentication

Я пишу приложение ASP.net MVC 5 с использованием FormsAuthentication. У меня было все и работаю правильно, используя FormsAuthentication.SetAuthCookie(user.Email, model.RememberMe).

Однако я хотел создать специальный билет, чтобы сохранить дополнительную информацию в поле UserData билета. Вот как я создаю свой билет и сохраняю его в файле cookie:

var ticket = new FormsAuthenticationTicket(1, user.Email, DateTime.Now, DateTime.Now.AddMinutes(FormsAuthentication.Timeout.Minutes), model.RememberMe, user.AuthToken);
var encryptedTicket = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket) { Domain = FormsAuthentication.CookieDomain, Path = FormsAuthentication.FormsCookiePath, HttpOnly = true, Secure = FormsAuthentication.RequireSSL };
HttpContext.Response.Cookies.Add(cookie);

Это создает зашифрованный билет и отправляет его в браузер. Я проверил с инструментами разработчика и Fiddler, что билет присутствует в браузере и что он отправляется обратно на сервер при последующих запросах.

Но аутентификация теперь нарушена. Кроме того, cookie недоступен в событиях Application_AuthenticateRequest или Application_PostAuthenticateRequest. Когда я использую отладчик для изучения Context.Request.Cookies, его нет в списке.

Как ни странно, cookie существует, если я вернусь в конвейер и проведу его в Application_BeginRequest:

void Application_BeginRequest(object sender, EventArgs e)
{
    // Auth cookie exists in the collection here! Ticket decrypts successfully
    HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
    if (authCookie == null)
        return;
    var encTicket = authCookie.Value;
    var ticket = FormsAuthentication.Decrypt(encTicket);
}

void Application_AuthenticateRequest(object sender, EventArgs e)
{
    // Auth cookie missing from the cookies collection here!
    HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
    if (authCookie == null)
        return;

    var encTicket = authCookie.Value;
    var ticket = FormsAuthentication.Decrypt(encTicket);
    using (var db = new BadgerContext())
    {
        var user = db.Users.OfType<RegisteredUser>().FirstOrDefault(x => x.UserName == ticket.Name);
        if (ticket.UserData != user.AuthToken)
        {
            FormsAuthentication.SignOut();
            Response.Redirect(FormsAuthentication.DefaultUrl);
        }
    }
}

Итак, кажется, что что-то лишает мой пользовательский FormsAuthenticationTicket из файлов cookie после BeginRequest, но до AuthenticateRequest. К сожалению, это полностью исключает аутентификацию на сайте.

Любые идеи, что вызывает такое поведение при создании пользовательского билета? Я что-то не так с моим созданием файлов cookie?

+3
источник поделиться
2 ответа

Роуэн предложил посмотреть значение FormsAuthentication.Timeout.Minutes. После исследования это значение всегда возвращалось как 0. Это привело к немедленному истечению срока действия билета. Я должен был использовать FormsAuthentication.Timeout.TotalMinutes вместо этого, и все начало работать нормально

0
источник

Проверьте файл .config внутри тега system.web node, тега httpRuntime.

<httpRuntime targetFramework="4.5" />

так же, как и основной веб-сайт

+6
источник

Посмотрите другие вопросы по меткам или Задайте вопрос