2

をゼロから作成しましたFormsAuthenticationTicketが、後で取得したときにUserDataが戻ってこないことがわかりました。使用されるコードは次のとおりです。

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                        1,
                        user.UserId,
                        DateTime.Now,
                        DateTime.MaxValue,
                        false,
                        user.UserType);

HttpCookie cookie = new HttpCookie(
     FormsAuthentication.FormsCookieName, 
     FormsAuthentication.Encrypt(ticket));

Response.Cookies.Add(cookie);

ただし、次の でこれを読み返すと、フィールドが空になっRequestていることがわかりました。UserData

string encryptedCookie = Request.Cookies[ FormsAuthentication.FormsCookieName ].Value;
FormsAuthenticationticket ticket = FormsAuthentication.Decrypt(encryptedCookie);
Assert.IsTrue( ticket.UserData.Length == 0 ); //TRUE!

何か案は?

4

3 に答える 3

9

私は問題を見つけたと思います。独自のクッキー名を作成すれば問題ないようです。したがって、次のように変更します。

HttpCookie cookie = new HttpCookie(
     FormsAuthentication.FormsCookieName, 
     FormsAuthentication.Encrypt(ticket));

HttpCookie cookie = new HttpCookie(
     "SiteCookie", 
     FormsAuthentication.Encrypt(ticket));

そして、質問に従ってそれを取得します:

string encryptedCookie = Request.Cookies[ "SiteCookie" ].Value;
FormsAuthenticationticket ticket = FormsAuthentication.Decrypt(encryptedCookie);
Assert.IsFalse( ticket.UserData.Length == 0 ); //Hooray! It works

その可能性のある.NETはそれでいくつかのトリッキーなことをするので、それを新しいものに入れることでうまくいきます.

アップデート:

また、チケットを更新する必要があります。そうしないと、ユーザーが Web サイトを使用している間にチケットの有効期限が切れてしまいます。

FormsAuthentication.RenewTicketIfOld(ticket); // Do before saving cookie
于 2010-09-08T15:17:56.493 に答える
2

私もこの問題に遭遇しました。しかし、本当の理由は、サーバーが同じ Cookie を 2 回設定し、2 回目は UserData フィールドを含む最初の Cookie をオーバーライドすることだと思います。

Fiddler による Cookie 書き込みプロセスをキャプチャできます。この問題を示すスクリーンショットを次に示します。 ここに画像の説明を入力

それで、これはどのように起こったのですか?私の状況では、Login コントロールを使用して認証します。Login コントロールの Authenticate イベントで、手動でユーザー名とパスワードを確認した後、UserData を使用して Cookie を設定しました。次に、AuthenticateEventArgs.Authenticated=trueこの時点で、デバッグ ウィンドウで を設定すると、新しい Cookie が FormsAuthentication.FormsCookieName と同じ名前の応答にキューされていることがわかります。私の解決策は、AuthenticateEventArgs.Authenticated=true を設定する代わりに、既定のページにリダイレクトすることです。

そのため、コードをデバッグして、認証 Cookie が応答に対して 2 回キューに入れられているかどうかを確認できます。

于 2012-07-12T02:27:09.737 に答える
1

これは私のために働く:

//Create Form Authentication ticket
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, currentUser.userid.ToString(), DateTime.Now, DateTime.Now.AddMinutes(60), false, currentUser.ToString(), FormsAuthentication.FormsCookiePath);

string hashCookies = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashCookies);
cookie.HttpOnly = true;
HttpContext.Current.Response.Cookies.Add(cookie);
于 2011-06-06T15:23:14.493 に答える