在我的应用程序(ASP.NET MVC 3)中,我有一个BaseController类,我所有的Controller都继承该类,并且在该BaseController中,我重写了OnActionExecuting方法来检查以确保填充Session变量,因为我需要在所有其他操作方法中访问该变量在应用程序中。我还具有定义的自定义Authorize属性,该属性扩展了AuthorizeAttributeClass。在该属性中,我重写OnAuthorization来检查正在BaseController OnActionExecuting方法中加载的同一Session变量,以查看是否应允许用户继续。
BaseController
public class BaseController : Controller
{
private ISessionUserService sessionUserService;
public BaseController(ISessionUserService sessionUserService)
{
this.sessionUserService = sessionUserService;
}
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (User != null && User.Identity.IsAuthenticated && this.sessionUserService.Current == null)
{
this.sessionUserService.Start(accountID, User.Identity.Name);
// If we weren't successful in reloading the SessionUser
// variable, redirect the user to the Sign In view
if (this.sessionUserService.Current == null)
{
filterContext.Result = new RedirectResult(Url.Action("SignIn", "Access", new { area = string.Empty }));
return;
}
}
}
}
自定义授权属性
public class AuthorizeByPermission : AuthorizeAttribute
{
public Permission[] Permissions { get; set; }
public AuthorizeByPermission(params Permission[] permissions)
{
this.Permissions = permissions;
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
SessionUser sessionUser = filterContext.HttpContext.Session.Get<SessionUser>();
if (sessionUser.HasPermission(Permissions))
return;
filterContext.Result = new HttpUnauthorizedResult();
}
}
问题是,BaseController OnActionExecuting方法在我的AuthorizeByPermission属性中的OnAuthorization方法之后触发,并且我需要采用另一种方法,因为如果在Authorize属性尝试访问之前不存在Session变量,则BaseController需要对Session变量进行泛化它。
基本上,我需要找到一种方法来拥有一个基类方法或一个全局过滤器,可以将其注册为在OnAuthorization方法触发之前发生。有关如何执行此操作的任何想法?
我尝试注册GlobalFilter来加载 session 变量并将其Order属性设置为低于AuthorizeByPermission属性,但这似乎也不起作用。
我还尝试覆盖了BaseController中的Execute方法,并且该方法实际上在自定义授权属性之前触发,但是问题是我没有访问filterContext的权限,如果我们无法访问,则可以将用户重定向到SignIn页面加载 session 变量。
根据bmosh的评论,我尝试将BaseController OnActionExecuting方法转换为单独的过滤器,并使用具有比AuthorizeByPermission属性小的订单号的该属性装饰BaseController,但仍然无法正常工作。
[FilterIWantToFireFirst(Order = 1)]
public class BaseController : Controller
{
}
public class AnotherController : BaseController
{
[AuthorizeByPermission(Permission.Add, Order = 2)]
public ActionResult SomeActionMethod()
{
}
}
即使使用上述设置,也会首先触发AuthorizeByPermission属性。
有任何想法吗?
最佳答案
您可以尝试在基本 Controller 中替代OnAuthorization而不是OnActionExecuting。
关于c# - 在OnAuthorization之前执行的ASP.NET MVC Global或BaseController ActionFilter,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7434237/