2011-06-24 8 views
1

最近mvc2からmvc3にアップグレードし、カスタム認可フィルタ(ActionResultメソッドに含まれる)の1つが一度構築されたように見えますが、複数回実行されているようです。フィルターにはエラーのリスト(コンストラクターで新しく作成されたもの)が含まれており、AuthorizeCoreにエラーが追加されているので、これはわかります。これは、同じように使用されるだろうカスタム認可フィルタのMVC3セッション奇妙な動作

public class SecurityAttribute : AuthorizeAttribute 
    { 
     public int MinAccessLevel = 1; 
     public string UserRole = String.Empty; 
     private List<string> _errors; 

     public SecurityAttribute() 
     { 
      _errors = new List<string>(); 
     } 

     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 

      if (WebSession.AccessLevel < MinAccessLevel) 
       _errors.Add("Your access level(" + WebSession.AccessLevel + ") must be " + MinAccessLevel + " or higher"); 

      if (!String.IsNullOrEmpty(UserRole) && WebSession.UserRole != UserRole) 
       _errors.Add("Your User Role must be " + UserRole); 

      if (_errors.Any()) 
      { 
       var viewResult = new ViewResult() { ViewName = "SecurityError"}; 
       viewResult.ViewData.Model = new SecurityErrorViewModel(){Errors = _errors}; 
       filterContext.Result = viewResult; 
      } 
     } 
    } 

カスタムフィルタは、特定のアクションメソッドへのユーザーのアクセス権限をチェックするために使用されている(とそのレベルがセッションに保存されている)

いくつかのコードを以下:

[HttpPost, Security(MinAccessLevel = 4)] 
public ActionResult Complete(int id, string userid){} 

(ランダムな間隔で)ビューの出力(箇条書き)そうように表示され

アクセスレベル(6)が4以上
  • アクセスレベルでなければならない(6)4以上
  • アクセスレベルでなければならない
    • (6)(4以上
    • アクセスレベルでなければなりません6)は4以上である必要があります

    この問題はmvc3にアップグレードした後に発生したため、これが起こった原因や適切な修正方法のヒントを探しています。私は、セッションレスステート・コントローラなどに関する様々なSOの記事を読みましたが、このdoesntのは、我々はMVC 3のリリースノートを1として

    おかげで、マーク

  • 答えて

    2

    に直面しているシナリオにフィットするように見える:

    を以前のバージョンのASP.NET MVCでは、いくつかのケースを除き、アクションフィルタがリクエストごとに作成されていました。この動作は決して保証された動作ではなく、単に実装の詳細であり、フィルタの契約ではステートレスとみなされていました。 ASP.NET MVC 3では、フィルタはより積極的にキャッシュされます。したがって、インスタンス状態を不適切に格納するカスタムアクションフィルタが破損する可能性があります。

    したがって、アクションフィルタ内にエラーを保存しないでください。 OnAuthorizationメソッドのリストを直接新規作成するか、または他の場所へのアクセスが必要な場合は、HttpContext.ItemsまたはSessionに格納することができます。

    +0

    ありがとうございます - 主な問題は、最初のリクエスト(一部のユーザーによる)からキャッシュされたようなアクセスレベルがあり、その後、有効なアクセスレベルを持つユーザーは、最初のリクエスト – harrisonmeister

    +0

    申し訳ありません、私はデュフュファスだった - あなたが意味することを理解し、Errors変数はコンストラクタで初期化され、キャッシュされました。権限のないユーザーがmvc3キャッシュに入ったときに、エラー変数がキャッシュされ、_errors.Any()呼び出しが常にその最初のインスタンスを返します(少なくとも1つのエラーを含みます)。 – harrisonmeister

    +0

    これはhttp://bradwilson.typepadをよく説明しています。 com/blog/2010/07/aspnet-mvc-filters-and-statefulness.html – harrisonmeister