- PR -

ログオフとみなされる条件は?

1
投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2007/08/21
投稿数: 48
投稿日時: 2007-09-19 19:12
VS2005、VBでWEBサイトを作っています。
TreeViewでメニューを表示していて、セキュリティトリミングにより
ロールごとにメニューを変えています。
認証はFORM認証ですが自前(下記参照)で作っています。
質問したいのは、ログオフのやり方です。
今のやり方ではFormsAuthentication.SignOut()をしてもTreeViewがログイン中のままになってしまいます。
TreeViewをログオフ状態にするためにはこの他に何をしなければならないのでしょうか?

ちなみに、TreeViewはmasterPage.masterに定義しており、下記のログイン、ログオフ処理はユーザーコントロールの中で実行しています。
そのため、両者には表に見える接点がありません。
(実際にはメンバーシップ?とかを通じて接点があるとは思いますが・・・・)

よろしくお願いします。


【ログイン時】
' @ 認証チケットの生成
' ロール情報を、認証チケットに忍ばせておく
Dim timeout As Integer = 30 ' この値はweb.config上の設定値と合わせる
Dim fat As FormsAuthenticationTicket = _
New FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddMinutes(timeout), _
False, String.Join("|", roles))

' A-a 認証チケットを暗号化して認証クッキーにする
Dim authCookie As String = FormsAuthentication.Encrypt(fat)

' A-b 生成した認証クッキーをクッキーとしてレスポンスにセット
Dim hc As HttpCookie = New HttpCookie(FormsAuthentication.FormsCookieName, authCookie)
hc.Path = FormsAuthentication.FormsCookiePath
Response.Cookies.Add(hc)


FormsAuthentication.RedirectFromLoginPage(userName, False)

【ログオフ時】
If (Not Request.Cookies("LoginForm") Is Nothing) Then
Dim hc As HttpCookie
hc = New HttpCookie(FormsAuthentication.FormsCookiePath)
hc.Expires = DateTime.Now.AddDays(-1D)
Response.Cookies.Add(hc)
End If
FormsAuthentication.SignOut()

どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2007-09-20 15:15
ロール情報を認証チケットの中に持つ、というのは標準の動作とは異なってますよね。
なので、TreeViewでセキュリティトリミングでロールごとにメニューを変えている、
という話ですけど、この部分も自前で何かやっていませんか?

#というか、何か自前でやってないとメニューが変化したりしないと思う。

その自前でやっている部分がSignOutと連動してないんじゃないでしょうか。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2007-09-20 16:26
TreeViewの動きは詳しくないんですが、普通に考えると現在のHttpContextのUserを使用して
ロールチェックを行っているはずだと思います。
※ロールプロバイダとかはこれを設定ところの機能ですよね?

で多分コードには出てないですけど、Global.asaxなんかでロールを取り出してUserをセットしなおしてるんではないかと。

で、SignOutメソッドは、説明を読めば分かりますが、単に認証チケットを削除するだけですので、そのリクエスト処理中はユーザは認証されたままです。
即座に認証状態を抜けたいなら、Userをその場で未認証状態にセットしてやる必要があると思います。

あと、SignOutで認証クッキーを削除してるんだから、その前の手動でのクッキー操作は不要だと思いますよ。
1

スキルアップ/キャリアアップ(JOB@IT)