0

一般的な問題:クラス/メソッド属性を使用して、.NETアプリケーション(WCFアプリケーションなど)にユーザーアクセス権の差別化システムを実装するにはどうすればよいですか?

だから、私たちは持っています:

  1. ユーザーのセット
  2. 一連の役割(たとえば、enum Role
  3. すべてのユーザーには、独自の役割のセットがあります。
  4. すべてのクラス/メソッドを特定の役割に指定できます。

    [AuthorizationAttribute(Roles = new Role [] {Role.Admin})] public class UserService:IUserService {

    }

  5. ユーザーのロールのセットにこのロールが含まれていない場合、ユーザーはメソッドにアクセスできないようにする必要があります。

アップデート。問題の説明をより明確にするように努めました。Aktonのソリューションは、この問題に適しています。

4

1 に答える 1

3

あなたが提案するような属性付きのセキュリティモデルを作成することは可能ですが、それは簡単ではありません。セキュリティ保護可能なオブジェクトは、ContextBoundObjectから継承し、セキュリティ属性はContextAttributeから継承する(またはIContextAttributeインターフェイスを実装する)必要があります。それで:

  1. IContextAttribute.GetPropertiesForNewContext(IConstructionCallMessage)メソッドを実装します。およびインターフェイスMySecurityPropertyを実装するオブジェクトを作成して呼び出し、コレクションに追加します。IContextPropertyIContributeObjectSinkIConstructionCallMessage.ContextProperties
  2. MySecurityProperty.GetObjectSink(MarshalByRefObject、IMessageSink)の実装では、 IMessageSinkインターフェイスを実装するオブジェクトを作成して呼び出しMySecurityAspectます。
  3. MySecurityAspect.SyncProcessMessage(IMessage)の実装では、実際に呼び出しをチェックして、それが有効かどうかを確認します。メソッド呼び出しを示すIMethodMessageにキャストする場合は、のプロパティをクエリIMethodMessageして、セキュリティ属性を使用してメソッドまたはクラスを呼び出しているかどうかを確認し、適切なチェックを行うことができます。呼び出しが許可されていない場合は、適切なタイプの例外をスローします。

動作させるには数時間かかりますが、動作するようになったら、それは理にかなっています。これは、.Netフレームワークの非常にサポートされていない部分です。複雑さを超えた大きな問題は、セキュリティ保護可能なクラスが他のライブラリクラスではなくContextBoundObjectから継承することを強制することです。ContextBoundObjectはMarshalByRefからも継承しますが、これはシリアル化を妨げる可能性があります。

詳細な説明については、http://www.developerfusion.com/article/5307/aspect-Oriented-programming-using-net/3/を参照してください。

于 2012-09-04T13:35:39.743 に答える