3

この記事の「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 にリダイレクトするにはどうすればよいですか?

4

2 に答える 2

4

これは興味深い問題であることがわかったので、.net フレームワーク ソースの掘り下げ、テスト、および少しのデバッグを開始しました。

基本的に、あなたがやろうとしていることはうまくいきません。ブラウザーが Cookie をサポートしていない場合、Response.Cookies コレクションに入力したものはすべて無視されます。Request.Browser.Cookies をチェックして、Cookie がサポートされているかどうかを確認できます。

asp.net では、セッション状態と認証の両方が Cookie なしモードをサポートしていますが、これは他の Cookie には拡張されません。実際、セッションと認証は、それ自体でも異なる動作モードに設定できるようです。

認証システムは独自のデータを URI に格納できますが、これは URI 自体を直接操作することによって行います。残念ながら、Microsoft はこれらの機能を認証モジュールの外部のコードに公開していないようです。

基本的に、 FormsAuthentication.GetAuthCookie() や FormsAuthentication.SetAuthCookie() などのメソッドを使用すると、認証システムが自動的にその情報を URI に入れますが、カスタマイズされたものを提供することはできません。これらのメソッドへの認証チケット...したがって、デフォルトの認証チケットで立ち往生しています。これらの場合、カスタムデータを保存するのはあなた自身です。

ともかく...

認証システムが Cookie レスになった場合、カスタム データを認証チケットに直接保存するメリットはあまりありません。とにかくセッションごと。

Cookie を使用しないが、このようなカスタム データが必要な場合の最も一般的な提案は、Cookie を使用しないセッションを有効にし、カスタム データをセッション変数として保存することです。セッション ID は URI に入れられますが、カスタム データはサーバーのメモリに残ります。セッションが Cookie を使用しないかどうかに関係なく、使用パターンは同じです。

本当にやりたいのであれば、カスタム データを URI に手動で格納するシステムを考え出すことができます。最も簡単な方法は、カスタム データをクエリ文字列に入れるか、pathdata を使用することです。サーバーメモリを使用しないように必死でない限り、これにはセッション変数に対する実際の利点は見られません(サーバーにメモリを少し追加するのは安価で、URLが見苦しく、それらを処理するためのコードを手動で書くのは安価ではありません)。

于 2008-11-05T08:47:12.280 に答える
1

素晴らしい説明をありがとう、スティーブン。ユーザーが Cookie を許可しない場合は、UserData を回避してデー​​タベースからデータをロードする必要があります。

上記のコードの前に、次のことを行います。

if( !HttpContext.Current.Request.Browser.Cookies || !FormsAuthentication.CookiesSupported )
{
    FormsAuthentication.RedirectFromLoginPage( userName, false);
    return;
}
于 2008-11-05T14:41:30.443 に答える