【发布时间】:2011-08-27 12:06:01
【问题描述】:
我们最近从 mvc2 升级到 mvc3,我们的自定义授权过滤器之一(位于 ActionResult 方法上)似乎只构建了一次,但执行了多次。我们知道这是因为过滤器包含一个错误列表(在构造函数中是新的),并且错误被添加到 AuthorizeCore。
自定义过滤器用于检查用户对特定操作方法的访问权限(并且他们的级别存储在会话中)
一些代码:
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 帖子,但这似乎不适合我们面临的情况
谢谢,马克
【问题讨论】:
标签: asp.net-mvc-3 session action-filter