CookielessモードでFormsAuthenicationTicket.UserDataを設定できません
-
06-07-2019 - |
質問
「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 );
Cookielessを使用すると、ページはリダイレクトされますが、Cookie情報を含む正しいURIを取得できないため、Request.IsAuthenticatedがfalseを返すログインページにループバックします。無限ループが続きます。
適切なURIにリダイレクトするにはどうすればよいですか
解決
これは興味深い問題であることがわかったため、.netフレームワークのソースを掘り、テストし、少しデバッグすることにしました。
基本的に、あなたがやろうとしていることは機能しません。ブラウザがCookieをサポートしていない場合、Response.Cookiesコレクションに入れたものはすべて無視されます。 Request.Browser.Cookiesをチェックして、Cookieがサポートされているかどうかを確認できます。
asp.netでは、セッション状態と認証の両方がCookieなしモードをサポートしますが、これは他のCookieには拡張されません。実際、セッションと認証は、それ自体でも異なる動作モードに設定できるようです。
認証システムは独自のデータをURIに保存できますが、URI自体を直接操作することで保存します。残念ながら、Microsoftはこれらの機能を認証モジュールの外部のコードに公開していないようです。
基本的に、FormsAuthentication.GetAuthCookie()やFormsAuthentication.SetAuthCookie()などのメソッドを使用する場合、認証システムは自動的にその情報をURIに入れますが、それはできません。これらのメソッドにカスタマイズされた認証チケットを提供します...デフォルトの認証チケットにこだわっています。これらの場合、カスタムデータを保存するのはあなた自身です。
とにかく...
認証システムがcookielessモードになった場合、認証チケットにカスタムデータを直接保存することにはあまり利点がありません... cookiepersモードでは、「永続的なcookie」など意味がないため、少なくともセッションごとに1回はデータを再生成します。
Cookieがなくてもこのようなカスタムデータが必要な場合の最も一般的な提案は、Cookieなしのセッションを有効にし、カスタムデータをセッション変数として保存することです。セッションIDはURIに格納されますが、カスタムデータはサーバー上のメモリに残ります。セッションがクッキーレスであるかどうかに関係なく、使用パターンは同じです。
本当に必要な場合は、URIにカスタムデータを手動で保存するシステムを考え出すことができます。最も簡単な方法は、カスタムデータをクエリ文字列に入れるか、パスデータを使用することです。サーバーメモリを使用しないように気を配らない限り、セッション変数に対するこれの本当の利点はありません(サーバーに少しのメモリを追加するのは安価で、URLいURLとそれらに対処するコードを手動で記述することは安くありません)。 / p>
他のヒント
すばらしい説明をありがとう、スティーブン。ユーザーがCookieを許可しない場合は、UserDataを避けてデータベースからデータをロードする必要があります。
上記のコードを実行する前に、次を実行します。
if( !HttpContext.Current.Request.Browser.Cookies || !FormsAuthentication.CookiesSupported )
{
FormsAuthentication.RedirectFromLoginPage( userName, false);
return;
}