使用暂停帐户重定向用户而不创建重定向循环

时间:2010-12-02 15:08:58

标签: c# asp.net-mvc membership subscription

我有一个基于订阅的MVC 2应用程序,其中包含基本的.NET Membership服务(在一些自定义组件下面,用于管理帐户/订阅等)。帐户已失效或手动暂停其帐户的用户需要能够访问管理其帐户状态的系统中的单个视图。使用[授权]属性保护驱动该视图的控制器。

我想确保在用户重新激活帐户之前,系统中无法访问其他任何视图。在我的基本控制器(我的所有受保护控制器派生出来)中,我尝试修改OnActionExecuting方法来拦截操作,检查挂起的帐户,如果它被挂起,则重定向到管理帐户状态的单个视图。但这让我陷入了无限循环。当新动作被击中时,OnActionExecuting再次被调用,循环继续。

我真的不想扩展[Authorize]属性,但如果需要可以。

关于如何在控制器级别执行此操作的任何其他想法?

编辑:在基本控制器中,我通过修改filterContext.Result属性来管理重定向(随后创建了重定向循环),将其设置为我所查看的视图的RedirectToAction结果。我注意到每次循环发生时,filterContext.Result == null。也许我应该检查filterContext的不同部分?

1 个答案:

答案 0 :(得分:0)

好的,所以这是我的解决方案,以防它帮助其他人。必须有一种更优雅的方式来做到这一点,如果有人有更好的想法,我会全力以赴。

在我的BaseController.cs中:

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        ViewData["CurrentUser"] = CurrentUser; // this is a public property in the BaseController

        if (CurrentUser != null && CurrentUser.Account.Status != AccountStatus.Active)
        {
            // if the account is disabled and they are authenticated, we need to allow them
            // to get to the account settings screen where they can re-activate, as well as the logoff
            // action.  Everything else should be disabled.
            string[] actionWhiteList = new string[] { 
                Url.Action("Edit", "AccountSettings", new { id = CurrentUser.Account.Id, section = "billing" }), 
                Url.Action("Logoff", "Account")
            };

            var allowAccess = false;
            foreach (string url in actionWhiteList)
            {
                // compare each of the whitelisted paths to the raw url from the Request context.
                if (url == filterContext.HttpContext.Request.RawUrl)
                {
                    allowAccess = true;
                    break;
                }
            }

            if (!allowAccess)
            {
                filterContext.Result = RedirectToAction("Edit", "AccountSettings", new { id = CurrentUser.Account.Id, section = "billing" });
            }
        }

        base.OnActionExecuting(filterContext);
    }