Silverlight Business Application テンプレートの認証機能

Visual Studio 2010 の Silverlight 4 用のプロジェクト テンプレートの中に [Silverlight Business Application] というものがあります。
認証機能を含み、Silverlight で業務アプリケーションを構築する場合の全体像を示したテンプレートといえます。
しかし、このプロジェクトを作成して即座に実行しても、認証機能が正しく動作するわけではありません。
 
以下では、この認証機能が動作するのに必要な手順を示します。
ASP.NET メンバーシップを利用します。
SQL Server のインスタンスは localhost\SQLEXPRESS とし、[Business1] データベースが作成されているものとします。
  1. コマンド プロンプトを起動し、次のコマンドを実行する。

    set regsql=%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\aspnet_regsql.exe
    %regsql% -S localhost\SQLEXPRESS -E -d Business1 -A mrp


      → [Business1] データベースにテーブルがいくつか作成される。
  2. Visual Studio を起動する。
  3. [ファイル] – [新規作成] – [プロジェクト] をクリックし、
    テンプレートから [Silverlight Business Application] を選択して [OK] をクリックする。
      → ソリューションおよびプロジェクトが作成される。
  4. (1) BusinessApplication1.Web プロジェクトの Web.config をダブルクリックする。
    (2) <connectionStrings>, <membership>, <roleManager>, <profile> 要素を次のように構成する。



    ・・・ (省略) ・・・

      <
    connectionStrings>
        <add name="Business1ConnectionString"
          connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=Business1;Integrated Security=True"
          providerName="System.Data.SqlClient" />
      </connectionStrings>

      <system.web>

    ・・・ (省略) ・・・

        <membership defaultProvider="Default" hashAlgorithmType="HMACSHA256">
          <providers>
            <clear />
            <add name="Default" applicationName="BusinessApplication1" connectionStringName="Business1ConnectionString"
               type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
          </providers>
        </membership>

        <roleManager defaultProvider="Default" enabled="true">
          <providers>
            <clear />
            <add name="Default" applicationName="BusinessApplication1" connectionStringName="Business1ConnectionString"
               type="System.Web.Security.SqlRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
          </providers>
        </roleManager>

        <profile defaultProvider="Default">
          <providers>
            <clear />
            <add name="Default" applicationName="BusinessApplication1" connectionStringName="Business1ConnectionString"
               type="System.Web.Profile.SqlProfileProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
          </providers>
          <properties>
            <add name="FriendlyName" />
          </properties>
        </profile>

      </system.web>

    ・・・ (省略) ・・・


  5. [デバッグ] – [デバッグなしで開始] をクリックする。
      → 作成されたアプリケーションが起動する。
これで、とりあえずアプリケーションは完成です。
右上の [login] をクリックするとログイン画面が現れますが、まだユーザーを作成していないので左下の [Register now] をクリックします。
 
 
正常に入力したら [OK] をクリックします。
 
 
ユーザーの作成とログインが完了しました。
[Friendly name] の値は表示用に使用されます。
次回以降は、ログイン画面でユーザー名とパスワードを入力すればログインできます。
 
注意点
(1) aspnet_regsql.exe の -A スイッチでは、m はメンバーシップ、r はロール マネージャー、p はプロファイルを表します。
     他に、c (Web パーツのパーソナル化) および w (Web イベント) があります。
 
(2) aspnet_regsql.exe により作成されたテーブルを削除するには、-A の代わりに -R を使用します。
%regsql% -S localhost\SQLEXPRESS -E -d Business1 -R mrp -Q
     -Q は確認メッセージが表示されないことを示します。
 
(3) aspnet_regsql.exe により作成されたテーブルには、
     パスワードをハッシュ化したり、プロファイルのデータを特殊な形式に加工したりして格納しなければなりません。
     従って、あらかじめ初期データを (Excel などで) 自分で作成しておいてそのままインポートするというのは難しいです。
     初期データを作成する場合にも、このテンプレートの UserRegistrationService クラスにあるような
     コード (Membership.CreateUser メソッドなど) を利用するのがよいでしょう。
 
(4) ログインすると認証 Cookie が発行されますが、これは ASP.NET の通常の Web アプリケーションで発行されるものと同じです。
     従って、同じ BusinessApplication1.Web の中では Silverlight 以外のページ (.aspx ファイルなど) ともログイン状態が共有されます。
 
(5) <membership> 要素の hashAlgorithmType 属性に HMACSHA256 を指定しています。
     この属性を指定しない場合、パスワードに対する既定のハッシュ アルゴリズムとして SHA1 が使用されます。
     しかし SHA1 については脆弱性が指摘されており、より強度のあるアルゴリズムが推奨されるため、
     明示的に HMACSHA256 や SHA256 などを指定することが望ましいです。
     (SqlMembershipProvider のハッシュ アルゴリズムに詳細を記述しました。)
 
     なお、<membership> – <providers> – <add> 要素の passwordFormat 属性を指定することにより、
     ハッシュ化 (Hashed) だけでなく、平文そのまま (Clear) や暗号化 (Encrypted) といった手段も選べます。
     暗号化を利用する場合、<machineKey> 要素の decryptionKey 属性にキーを明示的に指定する必要があります。
 
(6) サービスに対する認証および承認が必要な場合には、ドメイン サービス クラスに対して次の属性を使用します。
  • RequiresAuthenticationAttribute: 匿名ユーザーでない (ログイン済である) ことを要求します。
    Web.config の <deny users="?" /> に相当します。
  • RequiresRoleAttribute: 特定のロールに属していることを要求します。
    Web.config の <allow roles="roleNames" /> に相当します。
     以下に例を示します。

[EnableClientAccess]
public class DomainService1 : DomainService
{
    [RequiresAuthentication]
    public string GetMessageForAuthenticatedUsers()
    {
        dynamic profile = HttpContext.Current.Profile;

        return string.Format("ようこそ {0} !", profile.FriendlyName);
    }

    [RequiresRole("UltimateUsers")]
    public string GetMessageForUltimateUsers()
    {
        dynamic profile = HttpContext.Current.Profile;

        return string.Format("ようこそ {0} 様 !!", profile.FriendlyName);
    }

}

 
バージョン情報
Silverlight 4
.NET Framework 4
Visual Studio 2010 + Silverlight 4 Tools
SQL Server 2005, 2008, 2008 R2
 
 

コメント / トラックバック1件 to “Silverlight Business Application テンプレートの認証機能”

  1. SqlMembershipProvider のハッシュ アルゴリズム « Do Design Space Says:

    […] カテゴリー: .NET Framework — sakapon @ 07:32 Tags: 暗号化 前回の Silverlight Business Application テンプレートの認証機能でパスワードに対するハッシュ アルゴリズムについて少し触れましたが、 […]


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。