私はしばらくこれと戦ってきました。VS 2012 で、「インターネット アプリケーション」プロジェクト テンプレートを使用して新しい MVC4 アプリケーションを作成しました (簡単にするために、ExtendedMembershipProvider を使用する通常のアプリでも問題が発生しています)。
ログイン時に、いくつかの UserData をフォーム認証 Cookie に入れたいので、次のコードを使用します。
public ActionResult Login(LoginModel model, string returnUrl)
{
Request.Cookies.Remove(FormsAuthentication.FormsCookieName);
if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
HttpCookie authCookie = FormsAuthentication.GetAuthCookie(model.UserName, true);
string userData = "This is some test data.";
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
FormsAuthenticationTicket newAuthTicket = new FormsAuthenticationTicket(authTicket.Version, authTicket.Name, authTicket.IssueDate, authTicket.Expiration, authTicket.IsPersistent, userData);
string newAuthTicketEncrypted = FormsAuthentication.Encrypt(newAuthTicket);
authCookie.Value = newAuthTicketEncrypted;
Request.Cookies.Set(authCookie);
// Response.Write("Encrypted cookie value: " + authCookie.Value); // value here differs than what browser sees
// Response.Write("UserData: " + FormsAuthentication.Decrypt(authCookie.Value).UserData + "<br/>"); // userdata is present here.
// return, shortened for brevity
}
}
かなり基本的です。ただし、復号化するとCookieには存在しません。問題は、何かが新しいフォーム認証 Cookie をパイプラインの別の場所で作成していることにあるようです。これは、暗号化された Cookie の値を出力して、ログイン リクエスト後にブラウザに表示される値と比較することで証明できます。それらは違う!UserData が存在しない状態で、何かが Cookie を再作成して暗号化しています。name 値は Cookie に存在します - どこで、または何がこれを行っているのでしょうか? MS は、新しい WebMatrix メソッドを使用したフォーム認証で UserData を壊しましたか?