WebSurfer's Home

トップ > Blog 1   |   ログイン
APMLフィルター

接続文字列の取得方法

by WebSurfer 2010年7月30日 12:36

SQL Server などの接続文字列は、ソース中にハードコーディングせず、Web アプリなら web.config ファイルに、Windows アプリなら Settings.settings ファイルに格納しておき、そこから取得します。

その接続文字列を取得するコードは以下のようになります。

Web アプリケーション

string connectionString = 
  ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString;

Windows アプリケーション

string connectionString = 
  Properties.Settings.Default.MyDB;

上記で、MyDB は接続文字列を定義する際に自ら名づけた名前で、当然任意に別名をつけることができます。例えば MyDB と名づけると、web.config, Settings.settings ファイルの中では以下のようになります。

web.config

<connectionStrings>
  <add name="MyDB"
       connectionString="Data Source= ..."
       providerName="System.Data.SqlClient" />
</connectionStrings>

Settings.settings

<Settings>
  <Setting Name="MyDB" Type="(Connection string)" Scope="Application">

  ・・・中略・・・

  </Setting>
</Settings>

正確に憶えていないので、その度に昔のコードを調べるという面倒なことをしていましたが、自分のブログの索引からも見つけられるように書いておきました。

Tags:

ADO.NET

Forms 認証のタイムアウト判定

by WebSurfer 2010年7月30日 08:37

あまり役に立たないかもしれませんが、ASP.NET 標準の Forms 認証システムで、認証チケットが期限切れになっているかどうかを判定するという話です。なお、前提条件としてクッキーが有効になっていることを想定しています。

例えば、一旦認証を受けたユーザーが、ログオフせず、ブラウザを立ち上げたまま、長時間席を外すなどして、タイムアウトに設定した時間を超えてアクセスしなかった場合を考えてください。

ユーザーが席に戻ってきて再度アクセスした場合、アクセスしたページに匿名アクセスを許可してなければ、ログインページにリダイレクトされるというのが Forms 認証の通常の設定です。

そこで、ユーザーに認証チケットが期限切れとなっていることを知らせるにはどうしたらいいでしょうか?

User.Identity.IsAuthenticated ではダメです。認証されているか否かは判定できますが、認証チケットが期限切れかどうかはわかりませんから。

一旦認証を受けたが、認証チケットが期限切れになっているというのは、サーバー側では以下の条件で判定できるはずです。

  • 要求 HTTP ヘッダーに認証クッキーが含まれる。
  • 認証クッキーの中の認証チケットが期限切れ。

認証クッキーと認証チケットは違うことに注意してください。クッキーはチケットの入れ物に過ぎません。認証チケットの有効期限は、認証クッキーの Value の中に入っている情報の一つです。HttpCookie.Expires ではありません。

一般的に、一旦認証クッキーの発行を受ければ、セッションが切れない限り(注)、次の要求の時にブラウザはサーバーにクッキーを送ります。(注:認証クッキーを「永続化」している場合は話が違ってきます。詳しくは別の記事「Froms 認証クッキーの永続化」を見てください)

認証クッキーを取得し、その Value を復号して認証チケットを取得し、ユーザー名、期限切れか否かなどの情報を取得できます。それで上記の 2 つの条件を確認できます。例えば、ログインページにリダイレクトされたときに期限切れを知らせる場合は、Global.asax で以下のようにします(もしくは HTTP Module を作る)。

void FormsAuthentication_Authenticate(object sender, 
  FormsAuthenticationEventArgs args)
{
  // "/login.aspx" は実際に合わせて適宜変更してください。
  if (Request.CurrentExecutionFilePath != "/login.aspx")
  {
    return;
  }

  string cookieName = FormsAuthentication.FormsCookieName;
  HttpCookie authCookie = Context.Request.Cookies[cookieName];

  if (null == authCookie)
  {
    return;
  }

  FormsAuthenticationTicket authTicket = null;
  try
  {
    authTicket = FormsAuthentication.Decrypt(authCookie.Value);
  }
  catch (Exception ex)
  {
    return;
  }

  if (null == authTicket)
  {
    return;
  }

  if (authTicket.Expired)
  {
    // 知らせるための処置を書く。例えば下記:
    Context.Response.Write("<h1><font color=red>" +
      "Forms Authentication Ticket Expired" +
      "</font></h1><hr>");
  }
}

認証チケットが期限切れの場合、FormsAuthenticationModule が認証クッキーを削除しているようで、タイミングによっては認証クッキーは取得できないので注意してください。

従って、認証クッキーを取得できるのは、FormsAuthenticationModule.Authenticate イベント以前のタイミングになります。

Tags: ,

Authentication

SqlParameter の Size 指定

by WebSurfer 2010年7月29日 12:26

SqlParameter を SqlParameterCollection に追加する際、SqlParameterCollection.Add メソッドを使って以下のように設定することがよくあると思います。

command.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID");
command.Parameters.Add("@CompanyName", SqlDbType.NVarChar, 40, "CompanyName");

この時、3 つめの引数の SqlParameter.Size プロパティの値はどのようにすべきでしょうか? 例えば、フィールドの定義が nchar(5) だったら、上記のように 5 にすべきでしょうか? SqlDbType.Int だったら 4 にすべきでしょうか?

個人的には、特に必要がない限り 0 に統一しておくのがよいと思います。理由は以下のとおりです。

  • 固定長データ型では、Size の値は無視される。
  • 可変長データ型では、Size はサーバーに送信するデータの最大量を示す。ただし、0 の場合は制限しない。

「0 の場合は制限しない」というところが要注意です。MSDN ライブラリにはそのことは書いてありませんが、検証して確認しました。また、自動生成される TableAdapter のコードの中では、可変長��ータ型のデータも含めてすべて 0 が使われていますので、間違いないと思います。

わざわざ調べて意味のない(どのみち無視される)情報を書いたり、場合によっては不適切な値を書いたり、必要がある場合と見分けがつかなくなったり・・・というのは、どう考えても面白くないですよね?

通常 0 を使うと決めておけば、0 以外の数字が入っている時はそれなりの意味がある(設定する必要があるので数字が入っている)ということがすぐ分かります。

ただし、固定長データ型で情報として利用するとか、可変長データ型でサーバーに送信する文字数を切り詰めるなど、値を指定することに意味があるケースもあるようです。

詳しくは、MSDN ライブラリの SqlParameter.Size プロパティ を参照してください。(リンク先は .NET 3.0 のものです。.NET 4.0 は若干書いてあることが違います。仕様が変わったのかどうかは不明(未調査)です。)

Tags: ,

ADO.NET

About this blog

2010年5月にこのブログを立ち上げました。その後 ブログ2 を追加し、ここは ASP.NET 関係のトピックス、ブログ2はそれ以外のトピックスに分けました。

Calendar

<<  2018年11月  >>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

View posts in large calendar