我有一个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());
}
答案 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中使用了这种方式。