最近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以上である必要があります
この問題はmvc3にアップグレードした後に発生したため、これが起こった原因や適切な修正方法のヒントを探しています。私は、セッションレスステート・コントローラなどに関する様々なSOの記事を読みましたが、このdoesntのは、我々はMVC 3のリリースノートを1として
おかげで、マーク
ありがとうございます - 主な問題は、最初のリクエスト(一部のユーザーによる)からキャッシュされたようなアクセスレベルがあり、その後、有効なアクセスレベルを持つユーザーは、最初のリクエスト – harrisonmeister
申し訳ありません、私はデュフュファスだった - あなたが意味することを理解し、Errors変数はコンストラクタで初期化され、キャッシュされました。権限のないユーザーがmvc3キャッシュに入ったときに、エラー変数がキャッシュされ、_errors.Any()呼び出しが常にその最初のインスタンスを返します(少なくとも1つのエラーを含みます)。 – harrisonmeister
これはhttp://bradwilson.typepadをよく説明しています。 com/blog/2010/07/aspnet-mvc-filters-and-statefulness.html – harrisonmeister