ProfileRequiredActionFilter - 永久重定向用户

时间:2013-06-15 10:20:35

标签: c# asp.net-mvc asp.net-mvc-4

我有一个ProfileRequiredActionFilter的实现。它会检查用户是否正确填写了配置文件 - 如果没有,则会在RegisterSecondStep上重定向用户。

问题是这会将用户永久重定向到循环中。

public class ProfileRequiredActionFilter : IActionFilter
{
    #region Implementation of IActionFilter

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (HttpContext.Current.User.Identity.IsAuthenticated)
        {
            User user = UserTools.getUser(HttpContext.Current.User.Identity.Name);
            if (user.NickName == null || user.Firstname == null || user.Surname == null || user.StateId == 0)
            {
                filterContext.Result = new RedirectResult("/Account/RegisterSecondStep");
            }
        }
    }

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
    }

    #endregion
}

我在我的代码中添加了这部分 - 现在用户重定向一次到RegisterSecondStep,并且不允许做任何事情。一般 - 很好。但是如何允许用户注销?此按钮也被阻止,如果我点击“退出”,我就会重定向到.. RegisterSecondStep

public class ProfileRequiredActionFilter : IActionFilter
{
    #region Implementation of IActionFilter

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string text = HttpContext.Current.Request.Url.AbsolutePath;
        if (HttpContext.Current.User.Identity.IsAuthenticated)
        {
            User user = UserTools.getUser(HttpContext.Current.User.Identity.Name);
            if (user.NickName == null || user.Firstname == null || user.Surname == null || user.StateId == 0)
            {
                if (text != "/Account/RegisterSecondStep")
                {
                    filterContext.Result = new RedirectResult("/Account/RegisterSecondStep");
                }
            }
        }
    }

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
    }

    #endregion
}

这就是我运行此过滤器的方法

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new ProfileRequiredActionFilter());
    }

1 个答案:

答案 0 :(得分:2)

我不知道您如何将该属性应用于操作,但您不应将该属性应用于RegisterSecondStep或Signout等操作。只需继承ActionFilterAttribute

public class ProfileRequiredAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // your logic
    }
}

并将该属性应用于控制器:

[ProfileRequired]
public class SomeController : Controller
{
}

或行动:

public class SomeController : Controller
{
    [ProfileRequired]
    public ActionResult Index() 
    {
    }
}

另一个选项是提供覆盖该行为的另一个属性,并在ProfileRequiredActionFilter检查该属性是否已应用于操作。

if (filterContext.ActionDescription.IsDefined(typeof(ProfileNotRequiredAttribute), inherit: false))
{
    // do not redirect
}

AuthorizeAttribute中使用了这种方式。