LightSwitch に関するセキュリティ上の考慮事項

ほとんどのビジネス アプリケーションには、セキュリティ要件があります。 たとえば、アプリケーションやアプリケーションの画面にアクセスできる従業員を制限したり、特定のデータを表示または更新できるユーザーを制限したりできます。LightSwitch は、アプリケーションへのセキュリティの実装に役立つ、組み込みの認証および承認モデルを提供します。

認証と承認

認証は、ユーザーがだれであるかを確認するためのメカニズムです。 たとえば、Windows にログオンすると、ユーザー名とパスワードで自分自身であることが認証されます。 承認は、ユーザーができること、またはできないことを定義するメカニズムです。 たとえば、従業員は自分の給与情報を表示できる場合がありますが、おそらく、自分の給与を引き上げることは承認されていません。

LightSwitch で認証は、ユーザーを識別するために使用されるログオン画面で処理されます。 ユーザーが認証されると、ロールおよびアクセス許可によって、アプリケーションで承認されるユーザーの操作が決定されます。

認証の有効化

LightSwitch での認証は、既定で無効になっています。これは、アプリケーション デザイナーの [アクセス制御] タブで有効にします。 Windows 認証とフォーム認証の両方がサポートされています。 Windows 認証では、ユーザーの Windows ログオン情報を使用してユーザーを識別します。 フォーム認証では、アプリケーション管理者が、ユーザー ID とパスワードを作成します。

Windows 認証を選択すると、特定のユーザーとすべての Windows ユーザーのどちらがアプリケーションにアクセスできるかを選択することもできます。 すべてのユーザーを選択すると、有効な Windows ログオン ID を持つすべてのユーザーがアプリケーションにアクセスできますが、付与されるのは、最小限のアクセス許可のみです。 ユーザーに役割やアクセス許可を必要に応じて割り当てることもできます。

アクセス許可、ユーザー、ロール

LightSwitch での承認は、アクセス許可、ユーザー、ロールを定義して実行されます。 アクセス許可は、アプリケーション デザイナーの [アクセス制御] タブで開発者によって作成され、これらのアクセス許可の影響は、コードを記述してデザインされます。 たとえば、ViewSales アクセス許可を作成して、ユーザーが販売画面を表示することを承認できます。 画面の CanView メソッドで、現在のユーザーが表示のアクセス許可を付与されている場合にのみ画面を表示するコードを記述します。 画面を表示するアクセス許可を設定することに加え、画面上の個々のコントロール、エンティティのデータ エンティティまたはフィールド、クエリなどへのアクセスを制限するアクセス許可を作成することもできます。

ロールは、アプリケーションが展開された後に、アプリケーション管理者によって作成されます。 ロールには、1 つまたは複数のアクセス許可が含まれます。 たとえば、管理者は、販売ロールを定義して、ViewSales アクセス許可をそのロールに割り当てることができます。 アプリケーション管理者はユーザーの追加も行い、ユーザーにロールを割り当てます。 たとえば、ボブが販売部門の従業員の場合、管理者は、ボブの認証情報を追加してユーザーとして追加し、ボブに販売ロールを割り当てることができます。 アプリケーションを実行すると、コードによって、ボブのユーザー情報が評価され、ボブが販売ロールのメンバーであることが認識されて、販売の画面を表示するメニュー項目が表示されます。

すべてのアプリケーションには、既定のアクセス許可である SecurityAdministration アクセス許可があります。 このアクセス許可で、アプリケーション管理者が使用する [ユーザー] および [ロール] 管理画面へのアクセスが可能になります。 初めてアプリケーションを発行するときに、既定のアプリケーション管理者になる人の認証情報を提供できます。 そのユーザーは、最初にアプリケーションを実行したときに [ユーザー] および [ロール] 画面が表示され、ユーザーとロールを定義できます。

承認のテスト

アプリケーションをテストする場合は、定義したアクセス許可が正常に動作することを確認します。 これを行うには、アプリケーション デザイナーの [アクセス制御] タブで、デバッグ用のアクセス許可を有効にします。 たとえば、ViewSales アクセス許可を定義した場合は、そのアクセス許可の [デバッグ用に許可] チェック ボックスをオンにすることができます。 アプリケーションをデバッグする場合は、販売の画面が表示されることを確認できます。これは、ViewSales アクセス許可を持つユーザーとして実行しているためです。 特定のロールに割り当てられるアクセス許可をエミュレートするために、アクセス許可の任意の組み合わせを設定できます。

注意

SecurityAdministration アクセス許可をデバッグ用に有効にした場合は、デバッグ中に管理用の [ユーザー] および [ロール] 画面を表示できます。これらの画面にユーザーとロールを入力することはできますが、ユーザーとロールは、アプリケーションと共には配置されず、デバッグ用のアクセス許可としては使用できません。

セキュリティで保護された接続

LightSwitch ベースであり、インターネット インフォメーション サービス (IIS) を実行しているサーバーでホストされている 3 層クライアント アプリケーションの場合、アプリケーションとサーバーの間の通信では、よりセキュリティの高い HTTPS プロトコルではなく、HTTP プロトコルが使用されます。 この要件により、アプリケーションが攻撃者に対して脆弱なままになる可能性があります。 SSL (Secure Sockets Layer) 暗号化は、クライアント アプリケーションとサーバーの間で送信される機密情報または個人情報を保護するために役立ちます。 SSL を有効にすると、リモート クライアント アプリケーションは、「https://」で始まる URL を使用してサーバーにアクセスします。 LightSwitch ベースのアプリケーションをホストするすべてのサイトの SSL を構成することをお勧めします。 詳細については、「IIS 7 で SSL (Secure Sockets Layer) を構成する」を参照してください。

SSL を有効にするには

  1. メニュー バーで、[ビルド][発行] の順に選択します。

  2. 発行アプリケーション ウィザードで、[セキュリティの設定] タブをクリックします。

  3. [セキュリティで保護された接続 (HTTPS) が必要] セクションで、[On] オプション ボタンを選択します。

    注意

    この設定をオンにする場合、Web サイトが HTTPS を使用するように正しく構成されている必要があります。

データ層として SQL Server を使用する 3 層アプリケーションの場合は、IIS とデータベース間の通信も脆弱である可能性があります。 LightSwitch ベースのアプリケーションによってアクセスされるすべてのデータベースの SSL を構成することをお勧めします。 詳細については、「SQL Server への接続の暗号化」を参照してください。

セキュリティとバージョン管理

バージョン管理の対象である LightSwitch プロジェクトを使用すると、web.config ファイルの接続文字列に、プロジェクトの最新の開発者のユーザー名とパスワードが含まれることがあります。 これにより、プロジェクトをチェックアウトする次の開発者がこの情報を使用できるようになります。

この問題は、発行されたアプリケーションには当てはまらないので、発行ウィザードからの接続文字列情報はバージョン管理に保存されません。 デザイン時に運用データベースの代わりにテスト データベースを使用することで、承認されていないユーザーによる本番データへのアクセスを防ぐことができます。

セキュリティについてのその他の考慮事項

認証のほかにも、考慮すべき他のセキュリティの要素があります。 アプリケーションが機密性の高いビジネス データを処理しない場合でも、パスワードなどの他の情報が露出の危険にさらされる場合があります。

セキュリティは、サーバーにアクセスするコードを記述する場合も重要です。 たとえば、従業員が自分のデータのみを見ることができるように、従業員データをフィルター処理するクエリのコードを記述できます。

Private Partial Sub Employees_All_PreprocessQuery(ByRef query As IQueryable(Of Application43.Employee))
    query = From item In query Where item.EmpName = Me.Application.User.Nameitem
End Sub
partial void Employees_All_PreprocessQuery(ref IQueryable<Application43.Employee> query)
{
    query = from item in query where item.EmpName == this.Application.User.Name select item;
}

これは、データを表示するには役立ちますが、ユーザーがデータを更新または削除しようとして、同時実行の例外が発生した場合は、サーバーから返されるエラー情報内で、他の従業員のデータが公開される可能性があります。 この問題を回避するには、更新および削除のメソッドに追加コードを記述して、従業員が自分のデータだけを見ることができるようにします。

Dim user As String = Me.Application.User.Name
If Me.DataWorkspace.ApplicationData.Employees.Where(Function(e) e.Id = entity.Id AndAlso e.EmpName = user).Execute().Count() = 0 Then
    Throw New DataServiceOperationException("Permission error: Cannot modify a record you don't have access to.")
End If

string user = this.Application.User.Name;
if (this.DataWorkspace.ApplicationData.Employees.Where(e => e.Id == entity.Id && e.EmpName == user).Execute().Count() == 0)
{
throw new DataServiceOperationException("Permission error: Cannot modify a record you don't have access to.");
}

セキュリティで保護された一般的なコーディングについては、「セキュリティで保護されたアプリケーションの作成」を参照してください。

参照

処理手順

方法: Silverlight クライアント アプリケーションで認証を有効にする

その他の技術情報

配置: アプリケーションの配布と保守

デバッグ: エラーの検出と修正