.NET の認証ネタを 2 つ

1) IsInRole メソッド使うときの注意事項

ASP.NET のフォーム認証や Windows 認証を行うときがありますね。
その際、どのロールに属しているかを調べるために、IsInRole メソッド使うことが多いですが
非常に重要な注意事項があります。

MSDNより

新しいユーザーや新しいグループなど、新しく作成されたロール情報をテストする場合は、
ドメイン内でのロール情報の反映を強制するために、ログアウトとログインを行うことが重要です。
これを行わない場合、IsInRole テストを実行すると false が返されることがあります。

っていうか、必ず、ログアウト/ログインしないと、false が返って来ます。

2) .NET Framework 1.1 と 2.0 の AuthenticationType プロパティ

WindowsPrincipal クラスを使うと、ユーザープリンシパルを調べられますね。
では、実際に、WindowsIdentity クラスの AuthenticationType で使用する認証の種類を調べてみると…

AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
WindowsPrincipal user = (WindowsPrincipal)System.Threading.Thread.CurrentPrincipal;
WindowsIdentity ident = (WindowsIdentity)user.Identity;
Console.WriteLine("User name: {0}", ident.Name);
Console.WriteLine("Authentication type: {0}", ident.AuthenticationType);

これを、.NET Framework 1.1 と 2.0 の環境でそれぞれ実行してみます。すると…

1.1 => NTLM
2.0 => Kerberos

注意しましょう。

ASP.NET の Web パーツ パーソナライズ情報に SQL Server 2005 を使う

Visual Studio では、ASP.NET のパーソナライズ情報は SQL Server Express を使い
App_Data下の aspnetdb.mdf を使うのがデフォルトの動作です。
でも、SQL Server 2005 をすでにライセンスしていたら、SQL Server Express じゃなくて、SQL Server を
使いたいですよね。
そんな相談を受けたので、今回は、その方法を紹介しましょう。以下の 2 つのことを行います。

  1. SQL Server に サービス用のデータベースを作成/構成する
  2. web.config を変更して、SQL Server のデータベースを使用するようにする

では、順に説明しましょう。

1. SQL Server に サービス用のデータベースを作成/構成する

これには、ASP.NET のツールを使用します。
ASP.NET には、SQL Server プロバイダが使用する SQL Server データベースを
インストールする Aspnet_regsql.exe というツールがインストールされています。
Aspnet_regsql.exe ツールのインストール先は、

C:\WINDOWS\Microsoft.NET\Framework\<versionNumber>\aspnet_regsql.exe

です。
Aspnet_regsql.exe を使用すると、SQL Server データベースを作成したり、既存のデータベースにオプションを
追加または削除したりすることができます。
いろいろなコマンドラインオプションがあるのですが、悩んだら、コマンドラインを指定せずに
そのまま aspnet_regsql.exe を実行しましょう。
ウィザード画面が起動しますので、ウィザードに従ってください。

 aspnet_regsql
説明するまでもなく、簡単にできます。

このツールで SQL Server には、aspnetdb というデータベースが作成されますので確認しておきましょう。

2. web.config を変更して、SQL Server のデータベースを使用するようにする

ASP.NET から、SQL Server プロバイダを使う設定を web.config に記述します。
少し長いですが、2-1 から 2-4 まであります。飽きずについてきてくださいね。

2-1 接続文字列を記述する

接続文字列を記述して、SQL Server を使用するように記述します。 (nameはご自由にどうぞ)

<connectionStrings>
  <add name="MySqlConnection"
    connectionString="Data Source=localhost;Initial Catalog=aspnetdb;Integrated Security=SSPI;"/>
</connectionStrings>

2-2 メンバシップサービス情報を記述する

SqlMembershipProvider を使用するように記述します。

<system.web>
・・・
<membership defaultProvider="SqlMembershipProvider" userIsOnlineTimeWindow="15">
  <providers>
    <add name="SqlMembershipProvider"
    type="System.Web.Security.SqlMembershipProvider"
    connectionStringName="MySqlConnection"
    applicationName="WebPartsDemoApp"
    enablePasswordRetrieval="false"
    enablePasswordReset="true"
    requiresQuestionAndAnswer="true"
    requiresUniqueEmail="true"
    minRequiredNonalphanumericCharacters="0"
    maxInvalidPasswordAttempts="10"
    passwordFormat="Encrypted"/>
  </providers>
</membership>
・・・
</system.web>

参考: SqlMembershipProvider クラス

2-3 ロール管理情報を記述する

SqlRoleProvider を使用するように記述します。

<system.web>
・・・
<roleManager defaultProvider="SqlRoleProvider"
  enabled="true"
  cacheRolesInCookie="true"
  cookieName=".ASPROLES"
  cookieTimeout="30"
  cookiePath="/"
  cookieRequireSSL="true"
  cookieSlidingExpiration="true"
  cookieProtection="All" >
  <providers>
    <add connectionStringName="MySqlConnection"
      applicationName="WebPartsDemoApp"
      name="SqlRoleProvider"
      type="System.Web.Security.SqlRoleProvider" />
  </providers>
</roleManager>
・・・
</system.web>

参考: SqlRoleProvider クラス

2-4 Web パーツのパーソナライズ情報を記述する

SqlPersonalizationProvider を使用するように記述します。

<system.web>
・・・
<webParts>
  <personalization defaultProvider="SqlPersonalizationProvider">
    <providers>
      <add name="SqlPersonalizationProvider"
        type="System.Web.UI.WebControls.WebParts.SqlPersonalizationProvider"
        connectionStringName="MySqlConnection"
        applicationName="WebPartsDemoApp" />
    </providers>
  </personalization>
</webParts>
・・・
</system.web>

参考: SqlPersonalizationProvider クラス

以上で web.config に記述する内容は終わりです。
web.config の設定を行うことで、SQL Server 2005 の aspnetdb データベースを
使用するようになりますので、パーソナライズ情報は SQL Server に格納されます。
やはり、SQL Server はガンガンに使いたいものです。