7

すべての基幹業務アプリケーションと同様に、アプリケーションには複数のアプリケーションがありUsers、いくつかがRoles割り当てられている場合があります。最近、WPF MVVM アーキテクチャに移行し、ログインしている各ユーザーにロールを割り当てる最良の方法を探しています。Authentication、RoleManager、LoginService など、インターネット上には多くの用語が浮かんでいますが、どれを使用すればよいかわかりません。

これが私たちが持っているものです:

単一プロジェクト内で開発された小規模ビジネス アプリケーション (20 フォームあり)。DataAccess および として、 およびとともにアーキテクチャMVVMを使用します。LINQ-to-SQLModelRepository patternUnit Of Work

私たちが欲しいもの:

さまざまなフォームがあり、各フォームには挿入更新削除印刷などの操作があります。私たちが望むのは、ログインしているユーザーをそのロール、つまり実行できるタスクに応じて制限することです。たとえば、管理者はアプリケーションで自由に「何でも」実行できますが、他の一部のユーザーは、一部のフォームを表示したり、一部の操作 (つまり、更新または削除) を実行することを許可されていない場合があります。

では、どうすればこれを達成できますか。デスクトップ LOB アプリケーション内で MVVM アーキテクチャを使用して、この完全なメカニズムを実行するために使用できるサービスの種類。専門用語またはチュートリアルのリンクが役立ちます。

私が明確であることを願っています。事前にどうもありがとうございました。

編集: 私は多くのフォーラムや記事を調べましたが、それらはすべて ASP.NET に焦点を当てています。WPF 内でロールを割り当てるための具体的な実装はまだ見つかりません。また、ASP.NET のソースは WPF にうまく準拠していません。

4

5 に答える 5

4

ASP.NETメンバーシップロール管理プロバイダーを中心にソリューションを構築することをお勧めします(元の質問の編集にもかかわらず)。それらは MSDN で十分に文書化されており、非常に柔軟です。

WPF 統合に役立つと思われるいくつかのリンクを次に示します。

また、MVVM を使用していると述べました。一元化された承認クラスのインスタンスの静的クラス、またはグローバルにアクセス可能なプロパティ (グローバル変数を使用した WPF アプリケーションを参照) を持つことをお勧めします。このクラスのメソッドは、ユーザーに付与された権限に基づいて、適切な機能を有効/無効にしたり、表示/非表示にしたりするために、アプリ内の任意の場所 (ViewModel など) から呼び出すことができます。

于 2012-11-08T07:36:51.350 に答える
3

Microsoft のセキュリティ アプリケーション ブロックを見てください。私はそれをあなたのアプリケーションに幾分似ているアプリケーションに適用しました。アクセス許可は、Active Directory、SQL、またはフラット ファイルに保存できます。

http://msdn.microsoft.com/en-us/library/ff664771(v=pandp.50).aspx

http://msdn.microsoft.com/en-us/library/ff664559(v=pandp.50).aspx

于 2012-11-09T06:49:44.300 に答える
0

私がすることは、現在のユーザーの情報 (ロール、権限など) を含むクライアント層に静的クラスを作成することです。これらのアクセス許可は、たとえば列挙型などによってモデル化できます。次に、各 ViewModel で、たとえばクエリを実行する (レコードを表示する) か、保存または編集コマンドを実行するために、これらの列挙値のどれが必要かを定義できます。

于 2012-11-06T20:24:45.110 に答える
0

各コマンドに RequiredRole プロパティを配置し、CanExecute のオーバーライドを追加して、現在のユーザーがそれを実行する権利を持っているかどうかを確認するだけです。コマンドはこれで十分です。

一方、フォームを表示する権限は、画面コンダクター/タブ ホスト/...でチェックする必要があります。

Linq to Sql を使用して、役割と各役割を取得し、それで終了です。このような単純なタスクのために外部コードを統合することは気にしません。

より一般的なものにしたい場合は、DB にコマンド/フォームとロールをリンクするテーブルを保持し、リフレクションを使用してユーザーを承認します。

私はあなたがそれが役に立つことを願っています

于 2012-11-07T17:28:50.967 に答える
0

AD を使用して、ユーザーが属するロールを決定しています。次に、いずれかのロールに適切な権限があることを確認します。ただし、rolesanduserrolesテーブルを使用して、この部分を自分で行うことができます。

これら 2 つのアプローチのいずれかを使用すると、ユーザーは一連の役割になります。それが最初のステップです。

次に、アクションの時点で、ユーザーがアクセス許可を持っていることを確認する必要があります。メニュー構造はデータベースから動的に構築されるため、 のテーブルとMenuItemsを定義するテーブルがありますRoleMenuAvailability

最初のフィールドにはId、 、orderTitleImage sourceおよび がありnavigation target、その他のいくつかのフィールドがあります。

2 つ目は、RoleIdと およびmenuId編集可能かどうかです。したがって、行が存在するということは、それが読み取り可能であることを意味します (ナビゲーション ターゲット、つまりフォームの場合)。次に、メニュー項目がデータベースから読み込まれます。

var usersItems =
    items.Where(i => i.RoleMenuAvailabilities
                    .Any(r => domainUser.IsInDomainRole(r.UserRole.Description)))
         .OrderBy(m => m.MenuOrder);

UserRole.Descriptionこの場合、AD ロールの名前でありIsInDomainRole、ヘルパー関数です。

public bool IsInDomainRole(string role)
{
    var regex = new Regex("[^\\\\]+$");
    string name = this.Name ?? string.Empty;
    string domainRole = regex.Replace(name, role);
    return this.IsInRole(domainRole);
}

必要に応じて、rolemenuavailabilityテーブルを拡張して、削除、更新、追加などのフラグを追加することができます。

次の段階はまだ完全には実装されていませんが、その意図は、ユーザーに対してユーザー権限をキャッシュすることです。ViewModel 基本クラスにはユーザーへの参照があるため、CanEdit(int permissionId)関数を呼び出すことができます。次に、可視性またはコマンドを本質的に制御するプロパティはCanExecute、ユーザーのアクセス許可にアクセスし、アクションが何であれ、ユーザーがアクセス許可を持っているかどうかを確認できます。

これはまだ進行中の作業なので、他の提案がここに表示されることに興味があります。

于 2012-11-07T18:09:26.233 に答える