Не удается установить FormsAuthenicationTicket.UserData в режиме без файлов cookie - PullRequest
3 голосов
/ 04 ноября 2008

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

Ответы [ 2 ]

4 голосов
/ 05 ноября 2008

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

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

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

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

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

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

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

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

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

1 голос
/ 05 ноября 2008

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

До кода, указанного выше, я сделаю:

if( !HttpContext.Current.Request.Browser.Cookies || !FormsAuthentication.CookiesSupported )
{
    FormsAuthentication.RedirectFromLoginPage( userName, false);
    return;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...