Не удается установить FormsAuthenicationTicket.Пользовательские данные в режиме без использования cookies

StackOverflow https://stackoverflow.com/questions/262636

Вопрос

Я пытаюсь реализовать раздел "Запись информации в пользовательские данные" в эта статья, но это не работает должным образом, когда файл 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 );

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

Как мне перенаправить на соответствующий URI?

Это было полезно?

Решение

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

По сути, то, что вы пытаетесь сделать, не сработает.Все, что вы добавляете в ответ.Сбор файлов cookie будет просто проигнорирован, если браузер не поддерживает файлы cookie.Вы можете проверить запрос.Браузер.Файлы cookie, чтобы узнать, поддерживаются ли файлы cookie.

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

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

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

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

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

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

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

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

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

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

if( !HttpContext.Current.Request.Browser.Cookies || !FormsAuthentication.CookiesSupported )
{
    FormsAuthentication.RedirectFromLoginPage( userName, false);
    return;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top