ValidateAntiForgeryTokenの代わりに自作フィルタを用いてaspを解決する.Netmvc提供された偽造防止タグは、現在のユーザーのエラーではなく、他の宣言ベースのユーザーに適用されます.


以前aspを書いたことがあります.Netmvcは、現在のユーザエラーの処理に適用されない他の宣言ベースのユーザに適用される偽造防止タグについて、そのブログの最後に残念な思いを残した.そのブログでカスタマイズされたフィルタはactionで2回呼び出す必要があり、提供された偽造防止タグが他の宣言ベースのユーザに適用され、現在のユーザのようなエラープロンプトに適用されないことを避けることができる.呼び出されたコードは次のとおりです.
[HttpPost]
[AllowAnonymous]
[LoginAuthorize]
[ValidateAntiForgeryToken]
[LoginAuthorize]
public async Task Login(LoginViewModel model, string returnUrl)

LoginAuthorizeがactionで2回呼び出されていることがわかります.だからこれから暇があれば自分でValidateAntiForgeryTokenを書いてこの問題を徹底的に解決するつもりです.ここ数日ちょうど空いているので、この問題を解決しようとしています.複雑だと思っていたが、なかなか解決できなかった.しかし、実際にやっている過程では簡単です.ValidateAntiForgeryTokenの代わりにカスタムフィルタを使用するのは、想像していたほど難しくありません.実装されるコードは次のとおりです.
/// 
    ///    AntiForgeryToken  
    /// 
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public class CustomerValidateAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
    {

        internal Action ValidateAction
        {
            get;
            private set;
        }

        public CustomerValidateAntiForgeryTokenAttribute() : this(new Action(AntiForgery.Validate))
        {
        }

        internal CustomerValidateAntiForgeryTokenAttribute(Action validateAction)
        {
            this.ValidateAction = validateAction;
        }

        public void OnAuthorization(AuthorizationContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }
            try
            {

                this.ValidateAction();
            }
            catch (Exception ex)
            {
                EventLog.WriteLog(ExceptionHelper.GetErrorMessageByLog(ex));
                //string url = filterContext.HttpContext.Request.UrlReferrer.ToString();
                //EventLog.WriteLog(url);
                filterContext.Result = new RedirectResult("/account/login", true);
                return;
                //throw;
            }

        }

呼び出し方法:
 [HttpPost]
        [AllowAnonymous]
        //[LoginAuthorize]
        [SXF.Utils.MVC.CustomerValidateAntiForgeryToken]
        //[LoginAuthorize]
        public async Task Login(LoginViewModel model, string returnUrl)

フロントのcshtmlではまだ使用されています
@Html.AntiForgeryToken()

何も変わらない