- - PR -
ASP.NET セッション変数
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-09-09 00:50
unibon です。こんにちわ。
「セッション変数の中身が変わってしまう」ということを確認されたわけではなく推測なのですよね? 私も推測になりますが、セッションがすりかわっているのではなく、DB (やその他オブジェクト) にアクセスする際に別のレコードを読み書きしているのではないでしょうか? だんだん推測ばかりになりますが、ありがちなのは、たとえば SQL の SELECT の WHERE を使って1レコードに絞り込んだつもりで、1レコードしかないからという前提で最初にフェッチしたレコードを表示に使った場合などです。ここで、たとえば、選択条件の指定がまずくて1レコードに絞り込めずに、実際には複数レコードが選択されていてたまたま先頭のレコードをフェッチしたら違うレコードだったとかいうことがあります。 ユーザーが目にする画面では、ユーザーが自身のユーザー名を知ることができる表示はありますか?それとも検索結果の表示から間接的にユーザー名が分かるにすぎないのでしょうか? | ||||||||
|
投稿日時: 2005-09-10 00:17
引きずってますね。
ところで、セッション管理は、何でやってますか? また、クッキーはどうなってます? たとえば、クッキーレスでやっていて、お客さんの誰かがログインした後のページを「お気に入り」に登録しちゃってると、「セッションハイジャック」が起こる可能性があるんじゃないかな?と思いました。 理由: クッキーレスだと、セッション ID が URL の一部になる セッション ID は、有効なセッション ID が重ならないことは保証されているが、すでに無効になっているものと重ならないことは、保証されていない _________________ | ||||||||
|
投稿日時: 2005-09-10 01:26
ご返答ありがとうございます。
全てのご意見が勉強になります。 お客様が見る画面には自分のユーザ名を確認できる部分があります。 現象が発生した際に、お客様はその状態をPrintScreenで記録して くれていまして、そこにははっきりと他人のユーザ名が表示されています。 以前に書いたテキストボックスにセッション変数の値をセットしている というのが、上記のユーザ名を表示する部分です。 セッション変数の中身が変わってしまうというのは確かに推測なのですが、 このユーザ名の表示が変わる事が私の推測の根拠です。 セッション管理について、Web.configの該当部分は以下のとおりです。 <sessionState mode="InProc" ・ ・ cookieless="false" ・ ・ /> よって、URLにセッションIDが含まれている事はありません。 実機でも確認致しました。 …今は出口のない迷路のような状態でも、分かってみればきっと 単純な事なのかもしれませんね。 | ||||||||
|
投稿日時: 2005-09-10 01:47
NAL-6295です。 なんとなく、分かった気がする。 間違っていたらすいません。 セッションに保持しているのはユーザIDですよね。 で、モジュール内でクエリを実行して、ユーザ名を持ってきている。 で、そのクエリ文字列を格納している変数はモジュール内に持っているためShared扱いである。 そのため、タイミングでは違う結果セットを取得してしまうことがあり、違う人の名前が表示される。 あくまで、セッションの中にあるユーザIDは変わっていない。 という事では無いですか? [ メッセージ編集済み 編集者: NAL-6295 編集日時 2005-09-10 01:48 ] | ||||||||
|
投稿日時: 2005-09-10 02:30
あれ?そう言えば…。
セッションに持っているのは一体何…? WHERE 句の「ログインユーザ」というのはID?それとも名前? 名前で検索??なわけないですよね。 | ||||||||
|
投稿日時: 2005-09-10 19:54
まさか、コネクションをShared(static)で扱っているとか。[ メッセージ編集済み 編集者: todo 編集日時 2005-09-10 19:55 ] | ||||||||
|
投稿日時: 2005-09-11 11:44
ご返答ありがとうございます。
セッション変数の内容についてですが、 ユーザIDとユーザ名の両方があります。 ログイン時に、入力されたユーザIDからユーザ名を 取得し、セッション変数にセットしております。 これは最初に前提としてはっきり書かなければ いけなかった事ですね。 無用な混乱をさせてしまいまして大変申し訳 ありません。 セッション変数は他にもユーザの所属営業所コード、 所属営業所名、アプリケーション内での権限コード等 がありますが、全てセッション変数にセットする 部分はユーザIDと同じ箇所(ログイン直後)で行っております。 ですので、DBを検索する部分ではユーザIDを使用し、 テキストボックスにはユーザ名を表示しております。 ユーザIDはDB検索やDB登録などで多数使用しておりますが、 ユーザ名の使用用途はテキストボックスに表示する だけになります。 「コネクションをShared(static)で…」とのご指摘に ついてですが、コネクションは各Webフォーム内で SqlConnectionをインスタンス化して持っております。 Module関数へは参照渡しで引数に指定しております。 | ||||||||
|
投稿日時: 2005-09-11 12:05
つまり、ユーザIDをもとにDBに問い合わせを行って、ユーザ名を 取得し、セッションに登録しているのですよね。 で、過去に、
と、おっしゃっている。 ですので、 セッションに保持しているのはユーザIDですよね。 で、モジュール内でクエリを実行して、ユーザ名を持ってきている。 で、そのクエリ文字列を格納している変数はモジュール内に持っているためShared扱いである。 そのため、タイミングでは違う結果セットを取得してしまうことがあり、違う人の名前が表示される。 あくまで、セッションの中にあるユーザIDは変わっていない。 と、予測したのですが。 [ メッセージ編集済み 編集者: NAL-6295 編集日時 2005-09-11 12:06 ] |