C# ProfileRequiredActionFilter-永久重定向用户

C# ProfileRequiredActionFilter-永久重定向用户,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,我有一个ProfileRequiredActionFilter的实现。它检查用户是否正确填写了配置文件-如果没有,则在RegisterSecondStep上重定向用户 问题是此重定向将永久性地在循环中重定向用户 public class ProfileRequiredActionFilter : IActionFilter { #region Implementation of IActionFilter public void OnActionExecuting(Action

我有一个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,不允许它做任何事情。一般来说,不错。但如何允许用户注销?此按钮也被阻止,如果我单击“注销”,我将被重定向到<代码>寄存器秒步

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());
    }

我不知道如何将该属性应用于操作,但不应将该属性应用于诸如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
}

在中使用了这种方法。

好的,请告诉我如何不对这些操作应用该过滤器。我在第一篇文章中添加了一个
RegisterGlobalFilters
代码。当做