Не удается установить FormsAuthenicationTicket.UserData в режиме без файлов cookie

Я пытаюсь реализовать раздел «Запись информации в пользовательские данные» в эта статья, но он не работает должным образом, когда cookie является частью URI.

Мой код:

// Create the cookie that contains the forms authentication ticket
HttpCookie authCookie = FormsAuthentication.GetAuthCookie( userName, createPersistantCookie );

// Get the FormsAuthenticationTicket out of the encrypted cookie
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt( authCookie.Value );

// Create a new FormsAuthenticationTicket that includes our custom User Data
FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket( ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, "foo");

// Update the authCookie's Value to use the encrypted version of newTicket
authCookie.Value = FormsAuthentication.Encrypt( newTicket );

// Manually add the authCookie to the Cookies collection
HttpContext.Current.Response.Cookies.Add( authCookie );

// Determine redirect URL and send user there
string redirUrl = FormsAuthentication.GetRedirectUrl( userName, createPersistantCookie );

HttpContext.Current.Response.Redirect( redirUrl, false );

При использовании без файлов cookie страница перенаправляется, но не получает правильный URI с информацией о файлах cookie в нем, поэтому она возвращается на мою страницу входа в систему, где Request.IsAuthenticated возвращает false. Возникает бесконечный цикл.

Как мне перенаправить на правильный URI?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
1 873
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я обнаружил, что это интересная проблема, поэтому я начал копаться, тестировать и немного отлаживать исходный код .net framework.

По сути, то, что вы пытаетесь сделать, не сработает. Все, что вы помещаете в коллекцию Response.Cookies, будет просто проигнорировано, если браузер не поддерживает файлы cookie. Вы можете проверить Request.Browser.Cookies, чтобы узнать, поддерживаются ли файлы cookie.

В asp.net и состояние сеанса, и аутентификация поддерживают режим без файлов cookie, но это не распространяется на другие файлы cookie. Фактически, похоже, что сеанс и аутентификация могут быть настроены даже на разные режимы работы.

Система аутентификации может хранить свои собственные данные в URI, но делает это, напрямую манипулируя самим URI. К сожалению, похоже, что Microsoft не раскрыла эти возможности для кода вне модуля аутентификации.

По сути, если вы используете такие методы, как FormsAuthentication.GetAuthCookie () и FormsAuthentication.SetAuthCookie (), тогда система аутентификации позаботится о том, чтобы автоматически вставить эту информацию в URI ... но она не позволяет вам предоставить индивидуальный билет проверки подлинности для этих методов ... так что вы застряли с билетом проверки подлинности по умолчанию. В этих случаях вы можете самостоятельно хранить любые пользовательские данные.

В любом случае...

На самом деле нет большого преимущества в хранении пользовательских данных непосредственно в билете проверки подлинности, если система проверки подлинности перестала использовать файлы cookie ... в режиме без файлов cookie такие вещи, как «постоянный файл cookie», не имеют значения, поэтому вы будете регенерировать данные хотя бы один раз. в любом случае за сеанс.

Наиболее распространенное предложение для случаев, когда у вас нет файлов cookie, но все же нужны такие пользовательские данные, - это включить сеансы без файлов cookie и просто сохранить свои пользовательские данные в качестве переменной сеанса. Идентификатор сеанса будет помещен в URI, но пользовательские данные останутся в памяти на сервере. Шаблон использования идентичен независимо от того, используются ваши сеансы без файлов cookie или нет.

Если бы вы действительно хотели, вы могли бы придумать систему хранения пользовательских данных в URI вручную. Проще всего было бы поместить пользовательские данные в строки запроса или использовать данные пути. Я не вижу никакого реального преимущества в этом перед переменными сеанса, если только вы не решаетесь не использовать память сервера (добавление небольшой памяти к серверу - дешево, уродливые URL-адреса и ручное написание кода для их обработки - не дешево).

Спасибо за прекрасное объяснение, Стивен. В случаях, когда пользователь не разрешает файлы cookie, мне просто нужно избегать UserData и загружать данные из базы данных.

Перед приведенным выше кодом я сделаю:

if ( !HttpContext.Current.Request.Browser.Cookies || !FormsAuthentication.CookiesSupported )
{
    FormsAuthentication.RedirectFromLoginPage( userName, false);
    return;
}

Кого-нибудь действительно волнует, что визор не поддерживает файлы cookie? Если у вас не разрешены файлы cookie, вам не следует ожидать, что Интернет будет работать

Chris Marisic 11.02.2011 21:15

В общем, к такому выводу я пришел.

Greg 12.02.2011 03:56

Другие вопросы по теме