- - PR -
フォーム認証の有効時間について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-08-25 13:57
ASP.Netでフォーム認証を行っています。
ログイン画面にて入力されたユーザ/パスワードをDBと比較し、 一致した場合に認証クッキーを発行しています。 認証機能は正常に作動しているのですが、認証の有効時間を経過する前に ログイン画面に遷移してしまいます。 Web.configで設定した認証の有効時間を経過していなければ 遷移しないと思っていたのですがほかに何か設定すべきものがあるのでしょうか? よろしくお願い致します。 なお、設定/環境は下記の状態で確認しています。 〜Web.config〜 ■セッション状態の設定 <sessionState mode="InProc" ・・・ cookieless="false" timeout="60" /> ■フォーム認証設定 <authentication mode="Forms"> <forms name="USERID" loginUrl="login.aspx" protection="All" path="/" timeout="480"> </forms> </authentication> <authorization> <deny users="?" /> <allow users="*" /> </authorization> 〜WEBサーバ〜 WindowsXP IIS5.1 Visual Studio .NET 2003 〜認証部分のコーディング〜 ■認証時 FormsAuthentication.SetAuthCookie(strLoginID, False) ■ログアウト時 FormsAuthentication.SignOut() ※同一の環境で時間を短くした場合は下記のように作動しました。 ■セッションタイムアウト=1分、認証の有効時間=2分で確認した場合 0分〜1分間放置後にボタンをクリック →通常の処理(DBへの登録等)が行えました。 1分〜2分 →セッション切れ(エラー用の画面に遷移させています)となりました。 2分〜 →ログイン画面へ遷移しました。 | ||||
|
投稿日時: 2005-08-25 23:09
南部です。
認証後にリダイレクトされるページにブレークポイントを設定し、 イミディエイトウィンドウから ((System.Web.Security.FormsIdentity)Context.User.Identity) .Ticket.Expiration.ToString() の値を確認してみて下さい。 480分後の時刻が設定されているのであれば、 設定等は問題なさそうです。 どれくらいで認証が無効になったのかはわかりませんが、 その間、ブラウザを閉じずにいたのでしょうか? | ||||
|
投稿日時: 2005-09-01 20:02
イミディエイトウィンドウから
((System.Web.Security.FormsIdentity)Context.User.Identity) .Ticket.Expiration.ToString() の値を確認することができなかったのですが、 ログインしてから遷移する画面にて Dim id As System.Web.Security.FormsIdentity id = Context.User.Identity Dim aaa As String = id.Ticket.Expiration.ToString() を埋め込み、aaaの値を確認したところ、 認証してから480分後の時間が設定されていました。 認証が無効になったのは2時間程度でなりました。 その間はその端末を一切さらわない状態でした。(ブラウザも閉じていません) 480分後の時間が設定されていたのweb.configの設定は有効に なっているようでした。web.configの設定以外にフォーム認証にて影響がある 設定はあるのでしょうか? | ||||
|
投稿日時: 2005-09-01 22:58
南部です。
んー、おかしいですね。 ちなみに、「認証が無効になった」は 1.TicketのExpiredがtrueになっているということでしょうか? 2.それとも、認証クッキーが消失しているのでしょうか? 1の場合、なんか見逃しているいるのかもしれません(ユーザコードで) 2の場合、なんらかの外的要因で認証クッキーが削除されているかもしれません。 (スパイウェアクッキーとみなされたとか、、、) あいまいな回答で申し訳ございません。 | ||||
|
投稿日時: 2005-09-06 15:47
回答ありがとうございます。
1.TicketのExpiredがtrueになっているということでしょうか? →有効時間が経過する前にボタンクリック等によるサーバへの アクション実行時にログイン画面が表示されたので認証が無効に なったと判断していました。 2.それとも、認証クッキーが消失しているのでしょうか? →Temporary Internet Filesに認証クッキーを作成していないので 消失したかどうかの確認はできませんでした。 その後テストを行っていたのですが、ローカル上で実行(ログインのpage_loadに ブレークポイント設定)していたところ、5時間以上経過してもログイン画面は 起動されませんでした。 別環境(負荷分散装置経由)にて画面を起動したところログイン画面が表示されて しまいました。 負荷分散装置が何か影響があるのかどうか不明ですが、今回はログイン画面が表示 された場合、再度ログインして再処理を行うことにしてもらいました。 負荷分散装置については設定者に確認してみたいと思います。 クラサバでは考慮しなくてよかったことがWEBでは対応しないといけない事が 多いですね。 これからもっと勉強していきたいと思います。 | ||||
|
投稿日時: 2005-09-06 22:05
了解です。 ロードバランサを使用していたのですね。 認証クッキーは、認証チケットをWebサーバがもつ暗号化キーによって暗号化され、 その文字列がクッキー情報としてクライアント(ブラウザ)に渡されます。 暗号化キーはWebアプリケーション毎にそれぞれが自動生成するので(既定では)、 異なるマシンでは認証クッキーは復元できません。なのでクラスタ化して使用する場合、 共通の暗号化キーを明示的に指定する必要があります。 指定の仕方は、MSDNライブラリで「machineKey 要素」を検索して下さい。 ※追記 因みに、 FormsAuthentication.SetAuthCookie(strLoginID, False) で永続化をFalseにしているので、ローカル(Temporary Internet Files)に保存されない、 いわゆるセッションクッキーになっています。 これは、ブラウザのプロセス終了時に破棄されます。 [ メッセージ編集済み 編集者: nanbu 編集日時 2005-09-06 22:13 ] | ||||
|
投稿日時: 2005-09-06 23:28
NAL-6295です。
本題の回答ではありませんが、気になった事がありますので、書き込ませていただきます。
負荷分散の方法によりますが、SessionStateがInProcだと、同一セッション中、同じサーバにのみアクセスする設定であれば問題ありませんが、ランダムに振り分けられるような設定になっている場合、セッション情報に保持した内容が他のサーバに引き継がれません。 そのためランダムに振り分けられるような設定の場合、可能であれば、セッション情報用のサーバを一台設けてStateServerおよびSQLServerモードで利用しないとセッション情報にアクセスできません。 また、本題と関わりのある問題としては、負荷分散していない場合においても、InProcの場合プロセスリサイクルのタイミングでセッション情報が破棄してしまいます(つまりセッションタイムアウトよりも早くセッション情報が無くなる可能性がある)ので、InProcでの利用は控えた方が良いかもしれません。 _________________ 「伝える」とは「人に云う」と書く。 http://d.hatena.ne.jp/NAL-6295/ |
1