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 に答える