web-dev-qa-db-ja.com

FormsAuthentication.SetAuthCookie()メソッドとのCookieの混乱

そのため、StackOverflowにはこれに関して多くの投稿がありますが、私はまだ正確な問題を解決できませんでした。ここに要点があります:

認証が必要なWebサイトがあります。標準の.NET FormsAuthentication.SetAuthCookie()メソッドを使用して、ユーザーのセッションを永続化しています。

私の質問はこれです:web.configファイルには、「/ system.web/authentication/forms」ノードへのタイムアウト属性があります。この値を30分と設定した場合、これは、セッションが期限切れになる前にユーザーが非アクティブにできる時間ですか?

この値を何に設定しても、SetAuthCookie()で永続性をtrueに設定すると、Cookieセットの有効期限は90分になるためです。 SetAuthCookie()で永続性をfalseに設定すると、Cookieの有効期限は「セッションの終了」に設定されます。

その「タイムアウト」属性値は実際に設定されており、1か月または1年以上続く永続的なCookieを取得するにはどうすればよいですか?

39
Jason

/system.web/authentication/formsで見つかったパラメータタイムアウトは、認証チケットの期間のタイムアウト(分単位)です。

これは、一定の非アクティブ時間が経過すると、ユーザーが再度ログインするように求められることを意味します。このMy.Profile.Current.IsAuthenticatedを確認しようとすると、falseになります。

Cookieを保持しないことを選択できます。この状況では、チケットの有効期限が切れると、Cookieも有効期限が切れます。 Cookie(永続化されている場合)には、ユーザーがサイトに戻ってきたときにユーザーを記憶する目的があります。

Cookieを削除することを選択しない限り、ユーザーがユーザー名とパスワードを再度挿入する必要がないように、Cookieを10年間保持することをお勧めします。 Cookieは、ブラウザーが閉じられている場合(永続化されている場合)でも有効です。

覚えておくべきもう1つの重要なことは、slidingExpirationパラメーターです。

<authentication mode="Forms">
    <forms loginUrl="~/Partner/LogOn" defaultUrl="~/Home/Index" 
           timeout="30" slidingExpiration="true" />
</authentication>

真実であれば、サイトでアクティビティが発生するたびに認証チケットが更新されます:ページの更新など。

あなたができること-そして私がやったこと-このようなあなた自身のクッキーを書くことです:

 FormsAuthenticationTicket authTicket = new
     FormsAuthenticationTicket(1, //version
     userName, // user name
     DateTime.Now,             //creation
     DateTime.Now.AddMinutes(30), //Expiration (you can set it to 1 month
     true,  //Persistent
     userData); // additional informations

更新

グループを暗号化されたCookieに保存するため、このルーチンを実装しました。

Dim authTicket As System.Web.Security.FormsAuthenticationTicket = _
        New System.Web.Security.FormsAuthenticationTicket( _
            1, _
            UserName, _
            Now, _
            Now.AddYears(100), _
            createPersistentCookie, _
            UserData)

Dim encryptedTicket As String = System.Web.Security.FormsAuthentication.Encrypt(authTicket)

Dim authCookie As HttpCookie = New HttpCookie( _
    System.Web.Security.FormsAuthentication.FormsCookieName, _
    encryptedTicket)

If (createPersistentCookie) Then
    authCookie.Expires = authTicket.Expiration
End If

Response.Cookies.Add(authCookie)

ご覧のとおり、認証Cookieと認証チケットの有効期限を同じタイムアウトに設定しました(永続化されている場合のみ)。

もう1つ試したのは、暗号化されたCookieにユーザー名とパスワードを保存することです。マスターページがロードされるたびに、My.Profile.Current.IsAuthenticatedをチェックして、認証がまだ有効かどうかを確認します。そうでない場合は、再度Cookieを読み取り、ユーザー名とパスワードを取得して、DBで確認します。

Public Function ReadCookieAuthentication(ByVal Context As System.Web.HttpContext) As Security.CookieAuth

    Dim CookieUserData = New Security.CookieAuth()

    Dim cookieName As String = System.Web.Security.FormsAuthentication.FormsCookieName
    Dim authCookie As HttpCookie = Context.Request.Cookies(cookieName)

    If (Not (authCookie Is Nothing)) Then
        Dim authTicket As System.Web.Security.FormsAuthenticationTicket = Nothing
        Try
            authTicket = System.Web.Security.FormsAuthentication.Decrypt(authCookie.Value)
            If (Not (authTicket Is Nothing)) Then
                If (authTicket.UserData IsNot Nothing) AndAlso Not String.IsNullOrEmpty(authTicket.UserData) Then
                    CookieUserData = New JavaScriptSerializer().Deserialize(Of Security.CookieAuth)(authTicket.UserData.ToString)
                End If
                CookieUserData.UserName = authTicket.Name
            End If
        Catch ex As Exception
            ' Do nothing.
        End Try
    End If

    Return (CookieUserData)

End Function

Security.CookieAuthは、ユーザー名とパスワードを返すために作成したオブジェクトです。
CookieUserDataは、パスワードとグループを保存するストレージ(json形式で保存)です。

48
LeftyX