2

ページを通じて名前、姓などの情報を保持するグローバルユーザーデータを設定するにはどうすればよいですか?セッション変数を使用すると、認証Cookieの前に期限切れになります

ありがとう!

4

3 に答える 3

4

認証Cookieのuserdataフィールドを利用して、認証セッション時のデータを保存できます。

以下のコードは、デフォルトのMVCプロジェクトのAccountControllerからのログオンアクションです。

 [HttpPost]
 public ActionResult LogOn(LogOnModel model, string returnUrl)
 {
    if (ModelState.IsValid)
    {
        if (Membership.ValidateUser(model.UserName, model.Password))
        {
            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
            if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
        else
        {
            ModelState.AddModelError("", "The user name or password provided is incorrect.");
        }
    }
    // If we got this far, something failed, redisplay form
    return View(model);
}

置き換えることができます:

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

と:

string fullName = "User full name";

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2, model.Email, DateTime.Now,
                DateTime.Now.AddDays(2), model.RememberMe, fullName);

string encTicket = FormsAuthentication.Encrypt(ticket);
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket) { Expires = DateTime.Now.AddDays(2) });

通常の文字列にパックできるよりも多くのデータを格納する場合は、ある種のデータシリアライザーを調べる必要があります。

次に、認証Cookieが使用されている場合、シリアル化されたデータを解析するための何かを実装する必要があります。

データは次の方法で入手できます。

((FormsIdentity)User.Identity).Ticket.UserData;

お役に立てば幸い

編集: また、DateTime.Now.AddDays(2)を、認証セッションを有効なままにしておきたいものに変更します。

于 2011-05-08T02:58:32.500 に答える
1

セッション状態は、上記の問題に対処するためにさまざまな方法で構成できます。具体的には、インプロセスセッション状態(実行中のアプリケーションと同じアプリケーションドメイン/プール内で状態が維持される)を使用する場合は、タイムアウトをフォームcookieタイムアウト以上に増やすだけです。セッションをアウトプロセスで(リモートシステムまたはデータベースに)保存する場合は、それに応じて構成します。
ここにいくつかのリソースがあります:

于 2011-05-08T02:27:55.883 に答える
0

それを認証Cookieに保存すると、偽造される可能性があり、同様に期限切れになる可能性があります。これはどうですか?セッションと認証Cookieを同時に期限切れにすることができれば、それは機能しますか?もしそうなら、私はあなたにその解決策を簡単に提供することができます。以下のコードは、セッションが利用できないかどうかをチェックします。利用できない場合は、ログインページにリダイレクトされます。以下のlogin.aspxをログインに変更してください。また、ログイン時に、Session ["UniqueUserId"]を何らかの値に設定する必要があります(何でもかまいません。何かに設定する必要があります)。

protected void Application_PreRequestHandlerExecute(object sender、EventArgs e)
        {{
            //セッション状態が利用可能な場合にのみアクセスします
            if(Context.HandlerはIRequiresSessionState || Context.HandlerはIReadOnlySessionState)
            {{
                //認証されていて、ここにセッションがない場合..ログインページにリダイレクトします。
                HttpCookie authenticationCookie = Request.Cookies [FormsAuthentication.FormsCookieName];
                if(authenticationCookie!= null)
                {{
                    FormsAuthenticationTicket authenticationTicket = FormsAuthentication.Decrypt(authenticationCookie.Value);
                    if(!authenticationTicket.Expired)
                    {{
                        if(Session ["UniqueUserId"] == null)
                        {{
                            //これは、何らかの理由で、認証チケットの前にセッションが期限切れになったことを意味します。ログインを強制します。
                            FormsAuthentication.SignOut();
                            Response.Redirect( "Login.aspx"、true);
                            戻る;
                        }
                    }
                }
            }
        }

于 2011-05-08T03:53:12.550 に答える