2

サーバー側で WCF を使用する WPF クライアント/サーバー アプリケーションがあります。現在、セキュリティで保護されていないため、Active Directory のユーザーベース用にセキュリティで保護したいと考えています。アプリケーションは、Active Directory アカウント (SID、SAM など) への参照を介してユーザーのプロファイルにアタッチできる独自の役割/権限データベースをホストする必要があります。

セキュリティを実装するためのいくつかの手順と、ユーザーがアプリケーション内で持っている役割/権限を理解する必要があります。

  1. Active Directory によって承認された ID のみを許可するように WPF アプリケーションを取得するにはどうすればよいですか? 誰かがローカル ユーザー アカウントを使用してローカル コンピューターにログインした場合、明らかに WPF 実行可能ファイルを実行するためのアクセス権を持っています。これはapp.configの構成オプションで、認証をWindowsに設定するだけで残りは処理されるasp.net web.configと同じですか?
  2. ユーザーが有効な Active Directory ユーザーであることが証明されたら、ユーザーの WindowsIdentity をデータベース内のテーブルのロールに結び付ける最善の方法は何ですか? これは、カスタム RoleProvider を使用してアプローチするのが最善ですか?

これらの点を結び付けるのに役立つ適切なドキュメントはありますか? 私が読んだすべての WIF ドキュメントと私が見たすべてのチュートリアルのため、これらは私にとって意味をなさず、どこにも説明されていないように見える唯一のビットです。

WCF をセキュリティで保護する必要があることはわかっていますが、これは ASP.NET のように比較的単純であり、実際には正しく構成するだけで、残りは発生するだけであると理解しています。

4

1 に答える 1

1

質問1に関して:

公開された WCF メソッドでPrincipalPermissionAttributeを使用できます。

    [PrincipalPermission(SecurityAction.Demand, Role = "ProjectManagers")]
    [PrincipalPermission(SecurityAction.Demand, Role = "Developers")]
    [PrincipalPermission(SecurityAction.Demand, Role = "Operations")]
    [PrincipalPermission(SecurityAction.Demand, Role = "Clients OU Admins")]
    public string CreateUser(string strFName, string strLName, string strPassword, string strOUName)
    {
        return CreateADAccount(strFName, strLName, strPassword, strOUName);
    }

これにより、上記の 4 つのグループのいずれかのメンバーであるユーザーのみがメソッドの実行を承認されます。

質問 2 については、私の頭の上から、次のようなことができます。

以下のコードはテストされておらず、不完全です。概念化のみを目的としています。

public class ControlAuthenticator
{
    Dictionary<string, ControlRule> ControlRules { get; set; } 
    public ControlAuthenticator()
    {
        ControlRules = new Dictionary<string, ControlRule>();
    }

    public bool UserCanRead(string controlName)
    {
        var user = MainViewModel.Current.CurrentUserPrincipal;

        return ControlRules[controlName].ReadPermission.Split(Convert.ToChar(","))
                                     .Intersect(user.GetGroups().Select(g => g.Name))
                                     .Any();
    }
}

public class ControlRule
{
    public string ControlName { get; set; }
    public string ReadPermission { get; set; }
    public string WritePermission { get; set; }
}

アイデアは、ViewModel で、コントロール名を提供する userCanRead (または私が作成しなかった書き込み) メソッドを呼び出すことです。ブール値を返します。UserCanRead メソッドは、現在のユーザーが属しているグループに関連する ReadPermission プロパティ (許可されたグループのカンマ区切りの文字列である可能性が高いと思われます) にエントリがあるかどうかを確認します。相関がある場合は true を返します。

ViewModel で、true の場合は値を表示 (または編集を許可) し、それ以外の場合は別の値を表示するか、編集を禁止します。

于 2013-04-16T21:19:31.773 に答える