在我的应用程序(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/

10-09 17:37