2011-03-04 1 views
3

RequestResponseというプロパティのSystem.Web.Mvc.Controllerクラスを使用して、HTTPリクエストとレスポンスのクッキーを設定して読みたいとします。その理由は、要求から読み込んでヘルパークラスのデータを生成するユーティリティクラスを書く必要がなくなるからです。カスタムベースコントローラー(そのすべてのコントローラーが派生したもの)でこのようなコードをすべてプッシュすることができます。ASP.NET MVCでController.Requestを設定する方法

だから、私は `BaseController」に次のコード

if (Request != null) 
{ 
    HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 
    if (authCookie != null) 
    { 
     HttpContext.User = new GenericPrincipal(new GenericIdentity(authCookie.Value), null); 
     Thread.CurrentPrincipal = HttpContext.User; 
    } 
} 

を持っているが、Requestは常にnullです。これはどのように埋め込まれていますか?

答えて

4

このコードがベースコントローラのコンストラクタにある場合は正常です。あなたはInitializeメソッドに入れる必要があります。また、あなたがやっていることは、コントローラで行うべきではありません。あなたのコードを見ると、HttpContext.Userプロパティが設定されているように見えます。これはカスタムAuthorizeアクションフィルタで行う必要があります。例えば

:その後、

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) 
    { 
     var result = base.AuthorizeCore(httpContext); 
     if (result) 
     { 
      var authCookie = httpContext.Request.Cookies[FormsAuthentication.FormsCookieName]; 
      if (authCookie != null) 
      { 
       httpContext.User = new GenericPrincipal(new GenericIdentity(authCookie.Value), null); 
       Thread.CurrentPrincipal = httpContext.User; 
      } 
     } 
     return result; 
    } 
} 

と、この属性を使用してベースコントローラを飾る:この属性は、対応するアクションへのアクセスを与えるために認証されることをユーザーに要求すること

[MyAuthorize] 
public abstract class BaseController: Controller 
{} 

お知らせ認証が必要なコントローラ/アクションでのみ使用してください。

+0

私は実際に自分のコードを 'Initiaze'メソッドに入れました。私も 'MyAuthorizeAttribute'を持っています。私の問題は嘲笑です。私があなたのアプローチで行くなら、私は 'HttpContextBase'を模倣し、それを依存関係として注入する必要があります(私はMoqとStructureMapを使用しています)。私はそれが特に難しいと感じています。 'Controller.HttpContext'や' Controller.Request'を使うと、コントローラ上でこれらのプロパティを簡単に模擬することができます。 – Suhas

+0

@ Suhas、 'HttpContextBase'は引数として' AuthorizeCore'メソッドに渡されます。だからユニットテストでやる必要があるのは、それを嘲笑して渡すことだけです。 –

関連する問題