2

MVC Webサイトでフォーム認証を使用していますが、Cookieの追加に問題があります。暗号化されたフォーム認証チケットを使用して、Cookieに追加していますが、Cookieを検査すると(「AuthCookie」という名前で)存在しますが、値はは常にnullであり、有効期限は常に「01/01/000100:00」に設定されます...これが私のログインコントローラーコードです。

[HttpPost]
public ActionResult Index(Login login, string returnUrl)
{
    if (ModelState.IsValid)
        try
        {
            User user = UserManager.Login(login.Username, login.Password);
            string serialUser = Serialize.SerializeToString(user);
            string ticket = FormsAuthentication.Encrypt(
                new FormsAuthenticationTicket(1, login.Username, DateTime.Now, DateTime.Now.AddMinutes(20.0), login.RemeberMe, serialUser));

            HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, ticket) { Expires = DateTime.Now.AddMinutes(20) };
            Response.Cookies.Add(cookie);


            if (String.IsNullOrEmpty(returnUrl))
                return RedirectToAction("Index", "Home");
            else
                return Redirect(returnUrl);
        }
        catch (LoginFailedException)
        {
            ModelState.AddModelError("", "Login failed: Invalid Username or Password.");
            return View(login);
        }
    else
        return View(login);

}

最初は、暗号化された文字列が長さのために機能していないと思いましたが、簡単なテストクックを作成してこれをテストしたところ、同じ結果が得られました。

誰でも助けることができます

4

1 に答える 1

3

Redirect() または RedirectToAction() を呼び出すと、応答が終了するため、Cookie はクライアントに送信されません。いくつかの解決策:

  1. TempData を使用して、リダイレクト先のアクションに Cookie を書き込み、ダイレクト全体で情報を保持します。
  2. フォーム認証 Cookie 情報がCodePlex の NerdDinner コードに書き込まれる方法を見てみましょう。
  3. コメントで述べたように、ロール情報をセッションに保持できます。ロール情報をセッションに保存し、見つからない場合はロールから取得するという推奨事項は機能しますが、メンバーシップ システムをそのまま使用し、後でパフォーマンス チューニングを行うことから始めます。 .
于 2012-01-05T07:27:26.067 に答える