0

我有一个 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());
    }
4

1 回答 1

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中使用了这种方式。

于 2013-06-15T10:45:02.623 回答