0

フォーム認証チケットが更新され、古いチケットの有効期限が切れた後、ユーザーが追い出されるという問題があります。サインインして最初に取得したチケットは次のとおりです。

チケット: A094D6F0401A5B6D97688198B09F17B03D209...................... 終了: 2013 年 3 月 28 日 (木) 08:56:33 GMT

そして、しばらくしてチケットが更新され、このCookieを取得します:(Cookieはチケットの有効期限が切れると期限切れになるため、問題はありません)

チケット: 215373E662852AD0CC540AC27F547787............. 終了: 2013 年 3 月 28 日 (木) 08:58:17 GMT

このチケットは、ユーザーのバックグラウンドで JavaScript リローダーによって更新されます。今、ページを更新すると追い出されてしまうのですが、なぜですか? チケットを更新するときは、これを使用します:

        var Id = (FormsIdentity)HttpContext.Current.User.Identity;
        var Ticket = Id.Ticket;

        var NewAuthTicket = FormsAuthentication.RenewTicketIfOld(Ticket);

        HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(NewAuthTicket), new[] {""});

        if (NewAuthTicket != null && NewAuthTicket.Expiration > Ticket.Expiration)
        {
            // Create the (encrypted) cookie.
            var ObjCookie = new HttpCookie(FormsAuthentication.FormsCookieName,
                                           FormsAuthentication.Encrypt(NewAuthTicket))
                                {
                                    HttpOnly = true,
                                    Expires = NewAuthTicket.Expiration,
                                    Secure = FormsAuthentication.RequireSSL
                                };
            // Add the cookie to the list for outbound response. 
            HttpContext.Current.Response.Cookies.Add(ObjCookie);
            Ticket = NewAuthTicket;
         }

これに対する解決策はありますか?

アップデート:

初めてクッキーを設定するとき、これを使用します:

var ExpiryDate = !rememberMe ? DateTime.Now.AddMinutes(cookieTimeoutHour) : DateTime.Now.AddYears(1);

                //create a new forms auth ticket
                var Ticket = new FormsAuthenticationTicket(2, ui.UserNr.ToString(CultureInfo.InvariantCulture), DateTime.Now, ExpiryDate, true, String.Empty);
                //encrypt the ticket
                var EncryptedTicket = FormsAuthentication.Encrypt(Ticket);
                //create a new authentication cookie - and set its expiration date
                var AuthenticationCookie = new HttpCookie(FormsAuthentication.FormsCookieName, EncryptedTicket)
                                               {
                                                   Expires = Ticket.Expiration,
                                                   HttpOnly = true,
                                                   Secure = FormsAuthentication.RequireSSL
                                               };


                Current.Response.Cookies.Add(AuthenticationCookie);
4

1 に答える 1

0

クライアント ページでの単純なキープアライブによってフォーム認証 Cookie が保持されるのに、なぜそこまでの労力を費やす必要があるのでしょうか。

jQuery の例:

$(function() {
    window.setInterval(keepalive, 600000); // run keepalive every 10 mins
});

function keepalive()
{
   $.get({url:'/myemptykeepalivepage.aspx',cache:false});
}

クライアントがブラウザを閉じると、インターバル機能がキャンセルされ、ほら、フォーム認証チケットは自然に期限切れになります。

于 2013-03-28T09:26:48.400 に答える