2016-08-04 17 views
1

MVCで記述されたカスタムAuthorizeAttributeがあります。私はそれをセキュリティのためにコントローラに適用しました。私が書いたAuthorizeAttributeクラスには、Webサービスコールから収集したいくつかの変数があります。コントローラ内でWebサービスを再度呼び出す必要がないようにアクセスしたいと思います。これは可能ですか?コントローラ内のAuthorizationAttributeへのアクセス

+0

に従うことを別のクラスにHttpContext.Currentからアイテムを格納および取得するためのロジックをカプセル化したいと思うあなただけの 'authorization'にアクセスしたいですあなたのコントローラの属性? –

答えて

1

あなたの最善のアプローチは、そのデータは単一のHTTP要求に対して有効となりますので、これらの変数を格納するためHttpContext.Current.Itemsを使用することです。このような何か:

public class CustomAuthorize : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (httpContext.User.Identity == null) return false; 
     if (!httpContext.Request.IsAuthenticated) return false; 

     var user = new WSUser(); //get this from your webservice 
     if(user == null) return false; 

     httpContext.Items.Add("prop", user.Property); 

     return user.Authorized; 
    } 
} 

public class HomeController : Controller 
{ 
    [CustomAuthorize] 
    public ActionResult Index() 
    { 
     var property = (string) HttpContext.Items["prop"]; 
     return View(); 
    } 
} 

あなたはまた、クリーンなコードを維持するとSingle responsibility principle

0

静的なクラスにこれらの変数を保存して保存することができます。しかし、洗練されたソリューションは、コントローラの中でパラメータのように呼び出され、静的クラスを読み込んで必要なプロパティを返すモデルバインダオブジェクトを持つことです。 おそらく、セキュリティを適用している場合は、Webサービスを毎回呼び出すことが最善の方法です。

Reference for your custom model binder

関連する問題