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





Я обнаружил, что это интересная проблема, поэтому я начал копаться, тестировать и немного отлаживать исходный код .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, вам не следует ожидать, что Интернет будет работать