- PR -

IIS6でのドキュメント設定時のセッション切れ

投稿者投稿内容
りんご
会議室デビュー日: 2008/05/15
投稿数: 15
投稿日時: 2008-09-16 17:15
いつも参考にさせていただいております。

現在IIS 6.0、Windows Server 2003でWebサイトを作成しております。
開発環境はVisualStudio2008で、AjaxControlToolkitを使用しております。

Webサイトの画面遷移は、まずログイン画面を用意し、ログイン後トップページに遷移するという、ごく一般的な流れになっております。

このWebサイトを、仮想ディレクトリのプロパティ内にある「既定のコンテンツページを有効にする」でログイン画面ページ名を追加し、URLをエイリアス名まで指定すればログイン画面に遷移するようにしました。

すると、ログイン後トップページでボタンを押すなどしてサーバアクセスを起こすと、セッションが切れてしまうという現象が発生しました。

上記の設定をせずに、ページ名まで指定してアクセスするとセッション切れは発生しません。
(ちなみに、上記の設定を行い、かつページ名まで指定してアクセスした場合もセッション切れが発生します。)

既定のコンテンツページの設定が原因とは考えがたいのですが、ここしか原因が見当たりません。
また、そうだとしたらIISのバグではないかと感じています。

このような事例の書き込みを見つけることができなかったのですが、これはIISのバグなのでしょうか?

何かご存知の方いらっしゃいましたら情報を提供していただければと思っております。
宜しくお願い致します。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2008-09-16 17:49
ちょっと正確な設定がわかりませんが。

> Webサイトの画面遷移は、まずログイン画面を用意し、ログイン後トップページに遷移するという、ごく一般的な流れになっております。

ASP.NETが標準で持っているログインのときの遷移の仕組みとしては、
・最初のアクセスはdefault.aspxに接続しようとする。
・このとき、default.aspx自体を認証後でないとアクセスできないように設定しておくと標準ではlogin.aspxページにアクセスする。
・login.aspxページで認証を行うとdefault.aspxページに飛ぶ。
このような動きをするようになっています。

もしこの仕組みそのものを利用しているのであれば、

> このWebサイトを、仮想ディレクトリのプロパティ内にある「既定のコンテンツページを有効にする」で
> ログイン画面ページ名を追加し、URLをエイリアス名まで指定すればログイン画面に遷移するようにしました。

この設定をすることで正しく動かないようになって当然です。

独自にログイン画面等を作りこんでいるのであれば、どのような仕組みを使って実現しているのか、またセッション管理のための設定等も含めて必要そうな情報を提供していただかない限り、何がおきているかを他の人が理解することは難しいと思います。
りんご
会議室デビュー日: 2008/05/15
投稿数: 15
投稿日時: 2008-09-17 09:23
どっとねっとふぁんさん
ご返答ありがとうございます。

引用:

独自にログイン画面等を作りこんでいるのであれば、どのような仕組みを使って実現しているのか、またセッション管理のための設定等も含めて必要そうな情報を提供していただかない限り、何がおきているかを他の人が理解することは難しいと思います。



提供する情報があまりにも少なかったようで、申し訳ありません。
ログイン画面は特に作り込んではおりません。
以下のような流れになっております。

【000Login.aspx ログイン画面】
ユーザIDとパスワードを入力させ、入力値がDB内の情報のいづれかに一致するか否かを参照する。一致すればユーザ情報をDBから取得しセッションに入れ、トップ画面へ遷移。


【001Top.aspx トップ画面】
ログイン情報がセッションに入っているか否かをチェック。
入っていればページを表示。
入っていなければセッションエラーページへ遷移。

default.aspxやlogin.aspxといったページは用意していないのですが、
どっとねっとふぁんさんがおっしゃられているのはページ名の問題でしょうか。
それともページの遷移の問題でしょうか。

私の場合、ユーザ情報がセッションに入っていない場合はログインページには遷移せず、セッションエラー情報に遷移するようにしています。

つまり、仮想ディレクトリのプロパティ「既定のコンテンツページを有効にする」は

>default.aspx自体を認証後でないとアクセスできないように設定しておくと標準ではlogin.aspxページにアクセスする。

という機能を利用する目的ではなく、URLをエイリアス名まで指定するだけでログイン画面が表示される機能を利用する目的で設定しました。

なのでお恥ずかしいことに、どっとねっとふぁんさんが「動かなくなって当然」とおっしゃられている意図が理解できませんでした。

もし、認識が間違っておりましたらご指摘ください。
宜しくお願い致します。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2008-09-17 10:09
ASP.NETにはログイン(というかユーザ管理)のために用意された仕組みがいろいろあるのですが、それは全く使わずに自分でセッションを利用したログインコントロールを行っている、ということですね。

となると、あとはセッション関係の設定をどのように行っているかが知りたいです。
あと、ログイン画面とトップ画面は同じ仮想フォルダ内にありますか?

それとセッションが切れる、という具体例をもう少し詳細に書いてもらうほうがいいかな。
りんご
会議室デビュー日: 2008/05/15
投稿数: 15
投稿日時: 2008-09-17 16:12
ログイン画面、トップ画面はともに同じフォルダ内にあります。

セッションに関しては、下記の通りです。

ログイン画面にてユーザ認証後、ユーザ名などのユーザ情報をSession["login"]に格納。
トップ画面へ遷移。


トップ画面のページロードでSession["login"]==nullであればセッションエラー画面へ遷移。

トップ画面において、初期表示時(!IsPostback)の場合はSession["login"]に情報が格納されています。しかし何かしらのイベントが起き、サーバアクセスした後のページロード通過時にはSession["login"]がnullとなってしまう状況です。

ページロードに入った時点でSession["login"]==nullとなってしまうので、エラーの原因が掴めずに困っています。。。

宜しくお願い致します。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2008-09-17 18:27
> トップ画面において、初期表示時(!IsPostback)の場合はSession["login"]に
> 情報が格納されています。しかし何かしらのイベントが起き、サーバアクセス
> した後のページロード通過時にはSession["login"]がnullとなってしまう状況です。

このあたり、具体的にソースを提示してもらえませんか?
IISのバグよりはソースのバグのほうが可能性としては高いので。
りんご
会議室デビュー日: 2008/05/15
投稿数: 15
投稿日時: 2008-09-18 13:51
お伝えし忘れていましたが、Firefoxだと正常に動くのです。
だからコードが原因とは思っていないのですが。。。

ちなみにIEだとIE6でもIE7でもセッションは切れてしまいます。
ブラウザの更新ボタンを押しただけでもダメです。

以下、トップページのページロードです。
コメントを外してしまったのでとてもわかりにくいかと思いますが。。。
ユーザによって表示するコントロールを切り替えたり、GridViewへ流すデータを変えたりするのでコードがとてもごちゃごちゃしています。

おかしい点がありましたらご指摘ください。
宜しくお願い致しいます。

protected void Page_Load(object sender, EventArgs e)
{
//Label_titleを表示する
Label_title.Visible = true;

//工数算出
//kousu_total = 0;

if (Session["login"] != null)
{//★★ここでユーザ情報がセッションに入っているかをチェック!!
u_info = (UserClass)Session["login"];

//UserClass u_info = (UserClass)Session["login"];
string user_id = u_info.User_id;
string auth = u_info.Auth;
string sql;

if (!IsPostBack)
{
if (user_id.StartsWith("A"))
{
Label_title.Text = "すべての案件一覧";
sql = "SELECT * FROM VIEW_anken";
SqlDataSource3.SelectCommand = sql;
GridView2.DataBind();

if (auth == "1")
{//dpsgで承認権限のある人
//表示列制御
Anken_View(0);
ViewState["sql"] = sql;
//Viewの表示制御
MultiView2.ActiveViewIndex = 0;
//進捗登録パネル表示
Panel_shinchokuToroku.Visible = true;
}
else if (auth == "0")
{//dpsgで承認権限のない人
//表示列制御
Anken_View(1);
ViewState["sql"] = sql;
//Viewの表示制御
MultiView2.ActiveViewIndex = 0;
//進捗登録パネル表示
Panel_shinchokuToroku.Visible = true;
//マスターページのメニュー表示・非表示
if ((Panel)Master.FindControl("Panel_Bottom") != null)
{
Panel menu = (Panel)Master.FindControl("Panel_Bottom");
menu.Visible = false;
}
}
ListItem item_dpsg = new ListItem();
item_dpsg.Text = "DPSG";
item_dpsg.Value = "DPSG";
ddl1_clientG.Items.Add(item_dpsg);

SqlConnection conn_DPSGuser = new SqlConnection();
conn_DPSGuser.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ANKENConnectionString"].ToString();

SqlCommand cmd_DPSGuser = new SqlCommand();
cmd_DPSGuser.Connection = conn_DPSGuser;
conn_DPSGuser.Open();

cmd_DPSGuser.Parameters.Clear();
cmd_DPSGuser.CommandText = "SELECT User_ID,User_NAME FROM [06DPSG] WHERE Delete_Flg='0'";

SqlDataAdapter da = new SqlDataAdapter();
DataSet ds = new DataSet();

da.SelectCommand = cmd_DPSGuser;
da.Fill(ds, "dpsg");
DataTable dt = ds.Tables["dpsg"];

ListItem user = new ListItem();

for (int i = 0; i < dt.Rows.Count; i++)
{
user = new ListItem();
user.Text = dt.Rows[i][1].ToString();
user.Value = dt.Rows[i][0].ToString();
ddl1_client.Items.Add(user);
}
conn_DPSGuser.Close();
dt.Clear();
ds.Clear();
}
else
{
Label_title.Text = "すべての案件一覧";
sql = "SELECT * FROM VIEW_anken4ClientG";
SqlDataSource3.SelectCommand = sql;
GridView2.DataBind();

if (user_id.StartsWith("u") && auth == "1")
{
//表示列制御
Anken_View(0);
ViewState["sql"] = sql;
//Viewの表示制御
MultiView2.ActiveViewIndex = 0;
//進捗登録パネル非表示
Panel_shinchokuToroku.Visible = false;
}
else
{
GridView2.DataBind();
//表示列制御
Anken_View(0);
ViewState["sql"] = sql;
//Viewの表示制御
MultiView2.ActiveViewIndex = 0;
//進捗登録パネル非表示
Panel_shinchokuToroku.Visible = false;
}
}
}
else
{//ポストバックのとき位置固定とエラーメッセージクリア
LabelE_modoshi.Visible = false;
}

SqlConnection conn = new SqlConnection();
conn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ANKENConnectionString"].ToString();

SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;

if (u_info.User_id.StartsWith("u"))
{
conn.Open();
cmd.Parameters.Clear();
cmd.CommandText = "SELECT COUNT(AnkenID) FROM VIEW_distinct WHERE states='08' AND ClientID=@user_id";
cmd.Parameters.AddWithValue("@user_id", u_info.User_id);

SqlDataReader dr = cmd.ExecuteReader();
dr.Read();

int show_flag = 0;

if (dr.HasRows)
{
if (int.Parse(dr[0].ToString()) > 0)
{
string control_name = "";

if (u_info.Auth == "0")
{
control_name = "Image_Client";
}
else
{
control_name = "Image_ClientTop";
}
if ((System.Web.UI.WebControls.Image)Master.FindControl(control_name) != null)
{
System.Web.UI.WebControls.Image i = (System.Web.UI.WebControls.Image)Master.FindControl(control_name);
i.Visible = true;
show_flag = 1;
}
}
}

if (u_info.Auth == "1" && show_flag == 0)
{
dr.Close();

cmd.Parameters.Clear();
cmd.CommandText = "SELECT COUNT(AnkenID) FROM VIEW_distinct WHERE states='02' AND ClientG_ID=@userG_id";
cmd.Parameters.AddWithValue("@userG_id", u_info.Busho_code);

dr = cmd.ExecuteReader();
dr.Read();

if (dr.HasRows)
{
if (int.Parse(dr[0].ToString()) > 0)
{
if ((System.Web.UI.WebControls.Image)Master.FindControl("Image_ClientTop") != null)
{
System.Web.UI.WebControls.Image i = (System.Web.UI.WebControls.Image)Master.FindControl("Image_ClientTop");
i.Visible = true;
}
}
}
}
dr.Close();
conn.Close();
}
if (u_info.User_id.StartsWith("A"))
{
conn.Open();

if (u_info.Auth == "1")
{
cmd.Parameters.Clear();
cmd.CommandText = "SELECT COUNT(AnkenID) FROM VIEW_modoshi WHERE TantoID=@user_id";
cmd.Parameters.AddWithValue("@user_id", u_info.User_id);

SqlDataReader dr = cmd.ExecuteReader();
dr.Read();

int show_flag = 0;

if (dr.HasRows)
{
if (int.Parse(dr[0].ToString()) > 0)
{
if ((System.Web.UI.WebControls.Image)Master.FindControl("Image_dpsgMG") != null)
{
System.Web.UI.WebControls.Image i = (System.Web.UI.WebControls.Image)Master.FindControl("Image_dpsgMG");
i.Visible = true;
show_flag = 1;
}
}
}
if (show_flag == 0)
{
dr.Close();

cmd.Parameters.Clear();
cmd.CommandText = "SELECT COUNT(AnkenID) FROM VIEW_distinct WHERE states='03'";
dr = cmd.ExecuteReader();
dr.Read();

if (dr.HasRows)
{
if (int.Parse(dr[0].ToString()) > 0)
{
if ((System.Web.UI.WebControls.Image)Master.FindControl("Image_dpsgMG") != null)
{
System.Web.UI.WebControls.Image i = (System.Web.UI.WebControls.Image)Master.FindControl("Image_dpsgMG");
i.Visible = true;
}
}
}
}
dr.Close();

cmd.Parameters.Clear();
cmd.CommandText = "SELECT COUNT(AnkenID) FROM VIEW_anken WHERE states='04' AND dpsgTantoID=@id";
cmd.Parameters.AddWithValue("@id", u_info.User_id);
dr = cmd.ExecuteReader();
dr.Read();

if (dr.HasRows)
{
if (int.Parse(dr[0].ToString()) > 0)
{
if ((System.Web.UI.WebControls.Image)Master.FindControl("Image_dpsgMGnew") != null)
{
System.Web.UI.WebControls.Image i = (System.Web.UI.WebControls.Image)Master.FindControl("Image_dpsgMGnew");
i.Visible = true;
}
}
}
dr.Close();
}
else
{
cmd.Parameters.Clear();
cmd.CommandText = "SELECT COUNT(AnkenID) FROM VIEW_anken WHERE states='04' AND dpsgTantoID=@id";
cmd.Parameters.AddWithValue("@id", u_info.User_id);
SqlDataReader dr = cmd.ExecuteReader();
dr.Read();

if (dr.HasRows)
{
if (int.Parse(dr[0].ToString()) > 0)
{
if ((System.Web.UI.WebControls.Image)Master.FindControl("Image_dpsgNew") != null)
{
System.Web.UI.WebControls.Image i = (System.Web.UI.WebControls.Image)Master.FindControl("Image_dpsgNew");
i.Visible = true;
}
}
}
dr.Close();

cmd.Parameters.Clear();
cmd.CommandText = "SELECT COUNT(AnkenID) FROM VIEW_modoshi WHERE TantoID=@user_id";
cmd.Parameters.AddWithValue("@user_id", u_info.User_id);

dr = cmd.ExecuteReader();
dr.Read();

if (dr.HasRows)
{
if (int.Parse(dr[0].ToString()) > 0)
{
if ((System.Web.UI.WebControls.Image)Master.FindControl("Image_dpsg") != null)
{
System.Web.UI.WebControls.Image i = (System.Web.UI.WebControls.Image)Master.FindControl("Image_dpsg");
i.Visible = true;
}
}
}
dr.Close();
conn.Close();
}
}
}
else
{//★★セッションが切れていた時セッションエラー画面へ遷移
Response.Redirect("400SessionError.aspx");
}
}


[ メッセージ編集済み 編集者: りんご 編集日時 2008-09-18 13:53 ]

[ メッセージ編集済み 編集者: りんご 編集日時 2008-09-18 13:54 ]
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2008-09-18 14:42
> お伝えし忘れていましたが、Firefoxだと正常に動くのです。
> だからコードが原因とは思っていないのですが。。。

こういう話だと、サーバ側が問題なのではなく、クライアント側のブラウザの設定に問題があるのではないか、というのがあやしくなってきますが。。。
そのあたり大丈夫ですか?

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