2011-01-18 1 views
1

Castle Coreを使用してカスタム属性とインターセプタを作成し、属性を使用してコードにセキュリティチェックを挿入しています。例: [セキュリティ(「ROLE1」)]インターセプタの実装では私は傍受しているオブジェクトにどのようにアクセスできますか?

:上記の「いくつかのセキュリティテストを行う」セクションで

public class SecurityInterceptor : IInterceptor 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     object o; 

     MethodInfo mi = invocation.Method; 
     SecurityAttribute[] atts = (SecurityAttribute[])mi.GetCustomAttributes(typeof(SecurityAttribute), true); 

     // if method not marked with Security attribute, then pass on call 
     if (atts.Length == 0) 
     { 
      invocation.Proceed(); 
     } 
     else 
     { 
      //for now assume that there is only one security attribute on the method 
      //do some security test 
      { 
       invocation.Proceed(); 
      } 
     } 

    } 

は、私が取得するためにHttpContext.Sessionオブジェクトにアクセスする必要がありますいくつかのオブジェクトを保存してセキュリティテストを行います。

コードビハインドasp.netページ、すなわちPageクラスのインスタンスであると仮定します。 this.Contextをこのような属性で使用することはできません。[Security( " Role1 "、this.Context)]属性として は許可していません。

したがって、Interceptメソッド内のhttpContextにアクセスするにはどうすればよいですか?

また、アスペクトのようなやり方でこれを行うより良い方法がありますか?

答えて

4

IInvocationインスタンスのプロパティには、対象オブジェクトがあります。ですから、傍受がPageオブジェクト上で起こることが確実な場合、あなたのケースで、あなたがこれを行うことができるようになります。

var page = (Page)invocation.InvocationTarget; 

それは必ずしもそうではありません場合は、あなたがHTTPコンテキストへのアクセスを得る必要があります別の方法。

ベンは指摘しているように、HttpContext.Currentはどこからでも現在のHttpContextにアクセスできますが、その静的プロパティにアクセスすることはちょっとしたことです。そこより良い方法は、しかし、だ、それはセッション状態を注入するのを可能にするファクトリメソッドを登録することである:

あなたが ISessionStateインターフェイスとあなたがしたいAPIを持って適切なラッパーを作成したと仮定し
container.Register(
    Component.For<ISessionState>() 
     .UsingFactoryMethod(k => new SessionWrapper(HttpContext.Current.Session) 
     .Lifestyle.PerWebRequest)); 

ASP.NET HttpSessionStateオブジェクトと対話するときに使用します。インターセプターは、他のすべてのようなコンテナから引き出されているので

さて、それはISessionStateに依存することができます:あなたの迎撃がいいとテスト可能になり

public class SecurityInterceptor : IInterceptor 
{ 
    public SecurityInterceptor(ISessionState sessionState) 
    { 
     //... 
    } 
} 

を。

おそらくこれを行うには他にも多くの方法があり、より良い方法もあります。これはちょうどあなたのプロジェクトで乗り越えることができる方法に関するアイデアです:

+0

sidenote(おそらくそれはポストを再編集する価値があります)@ mookid8000 - FactorySupportFacilityは 'UsingFactoryMethod'では必要ありません(旧バージョンのウィンザー)。ファシリティは、XMLを使用してファクトリを指定する場合など、従来のシナリオでのみ有効です。 –

+0

@ Krzysztof私はそれを知らなかった - ありがとう!私はそれに応じて答えを編集しました。 – mookid8000

1

コードがASP.netプロセスから呼び出されている限り、どこでもHttpContext.Current.Sessionを使用できます。

関連する問題