2012-03-04 7 views
3

私は現時点で書いているWPFアプリケーションのために何らかの種類のRBACを実装する必要があります。 v2.0 ASP.NETには、セキュリティ、メンバーシップ、役割管理のインフラストラクチャ(例えば、hereと記載されています)が使用されていますが、このコンテキストで使用することはまだ少し難解です。私は、それを使用し、同様の文脈で成功した人からのフィードバックを歓迎します。WPFアプリケーションのロールベースのアクセス制御 - ベストプラクティス

また、AD LDSの使用を検討してTechNetの記事を読んでいくつかのMSDNコードサンプルを見てきましたが、そこに固有の複雑さを取り除くコンポーネント(.NET用)があるかどうかは疑問ですデータベースの作成、導入のためのセットアップ、および継続的なメンテナンスが含まれます。この場合、無料または商業用は大丈夫です。

他の質問にはクライアントアプリケーションサービスがありますが、これは可能性の範囲を超えないで、プロジェクトの始めに想像していなかったものです。

この場合のベストプラクティスは何ですか?このアプリケーションは、典型的なn層型の事件であり、リモートのSQL Serverデータベースと会話し、必要に応じて役割を格納できるようにする。

+1

AD LDSの場合、適切な権限を持っている場合は、ADストアにデータをホストできます。うまくいけば、これはあなたのための問題を簡素化するでしょうか? – code4life

+0

@ code4lifeこのウェブの例は何ですか? – noonand

+1

ここから始めます。http://msdn.microsoft.com/en-us/library/aa772138.aspx FYIのように、AD LDSは必ずしもデータベースよりも単純なものにするわけではありません。 – code4life

答えて

5

P & Pガイダンス/アイデアおそらくそれらのブロックを使用することができます)。 http://msdn.microsoft.com/en-us/library/ff953196(v=pandp.50).aspx

SQLServerに独自のバックエンドストアを実装しました。 User、UserRole、SecurityItem、SecurityItemUser、SecurityItemRoleのようなテーブルはそれほど難しくありません。私はADに対してユーザーのWindowsログインを認証しますが、Windowsログイン名をデータベースに保存します(Userテーブルのキーなど)。

インタフェース/プロバイダモデルを介して物事を抽象化することをお勧めします。そうすれば、あなたのアプリが将来変更された場合でも、多くのリファクタリングを必要としません。

2層のアプリケーション(WPF - > SQLServer)が大きく成長し、管理者は3層アプリケーション(WCF中間層)を必要とするセキュリティを決定しました。私はこれで今作業しています。私は認可コードをクライアントアプリケーションとあまりにも緊密に結びつけたので、本当に苦しいです。承認がサービス層で起こっているはずですが、多くの作業が必要になることは明らかです。

特定の「セキュアなもの」を特定する方法に関して、私は多くの作業を省く素晴らしいトリックを思いついた。皮肉なことに、これは問題の一部ですが、今私は3段階で再エンジニアリングしようとしています。トリックは、あなたには、いくつかの簡単なコードあなたがチェックするたびに使用することができ、固定可能なの一意の識別子としてクラスの完全修飾名を使用することです。ここでは

_secUtil.PromptSecurityCheck(_secUtil.GetFullyQualifiedObjectName(this, "Save")) 

はあなたにどのようにアイデアを与えるためにいくつかの他のコードです私はそれをしました(P & Pフレームワークを使って)。

public class SecurityUtil : ISecurityUtil 
{ 
    public string DatabaseUserName { get { return LocalUserManager.GetUserName(); } } 

    public bool PromptSecurityCheck(string securityContext) 
    { 
     bool ret = IsAuthorized(securityContext); 

     if (!ret) 
     { 
      MessageBox.Show(string.Format("You are not authorised to perform the action '{0}'.", securityContext), Settings.Default.AppTitle, 
             MessageBoxButton.OK, MessageBoxImage.Error); 
     } 

     return ret; 
    } 

    public bool IsAuthorized(string securityContext) 
    { 
     IAuthorizationProvider ruleProvider = AuthorizationFactory.GetAuthorizationProvider("MyAuthorizationProvider"); 

     //bool ret = ruleProvider.Authorize(LocalUserManager.GetThreadPrinciple(), securityContext); 
     bool ret = ruleProvider.Authorize(LocalUserManager.GetCurrentPrinciple(), securityContext);    
     return ret; 
    } 

    public string GetFullyQualifiedName(object element) 
    { 
     return element.GetType().FullName; 
    } 

    public string GetFullyQualifiedObjectName(object hostControl, string objectName) 
    { 
     return GetFullyQualifiedName(hostControl) + "." + objectName; 
    } 
} 

[ConfigurationElementType(typeof(CustomAuthorizationProviderData))] 
public class MyAuthorizationProvider : AuthorizationProvider 
{ 
    public SitesAuthorizationProvider(NameValueCollection configurationItems) 
    { 
    } 

    public override bool Authorize(IPrincipal principal, string context) 
    { 

     bool ret = false; 

     if (principal.Identity.IsAuthenticated) 
     { 
      // check the security item key, otherwise check the screen uri 
      ret = LocalCacheManager.GetUserSecurityItemsCache(LocalUserManager.UserId, false).Exists(
       si => si.SecurityItemKey.Equals(context, StringComparison.InvariantCultureIgnoreCase)); 

      if (!ret) 
      { 
       // check if this item matches a screen uri 
       ret = LocalCacheManager.GetUserSecurityItemsCache(LocalUserManager.UserId, false).Exists(
       si => si.Uri.Equals(context, StringComparison.InvariantCultureIgnoreCase)); 
      } 
     } 

     return ret; 

    } 
} 
+0

被験者のPnPガイダンスを逃しましたが、前にAzManを訪れました。ありがとう! – noonand

+1

これを読むために回覧している人のためのFYIと同じです。セキュリティアプリケーションブロックはEntLibのv6で廃止されました。詳細については、移行ガイド(http://go.microsoft.com/fwlink/?linkid=290906&clcid=0x411)を参照してください。 – noonand

関連する問題