首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AntiforgeryToken验证失败

AntiforgeryToken验证失败
EN

Stack Overflow用户
提问于 2018-07-20 12:37:46
回答 1查看 1.2K关注 0票数 0

我有ASP核心2.1应用程序,与角SPA客户端一起工作。我像声明的这里一样保护我的应用程序。

但问题是,我经常收到400坏的请求后,我立即登录到系统。根据我的观点,这就是系统中发生的情况:

  1. 对应用程序->的第一个请求返回AntiForgery、CookieToken和RequestToken (重要注意,用户尚未通过身份验证)
  2. 用户登录到系统-> AntiForgery验证通过,身份验证cookie发送到客户端。
  3. 用户请求任何其他端点,但是由于AntiforgeryTokenSet是为未经身份验证的用户发出的,因此他收到了400个坏请求。

很明显,登录后我们需要重新发布AntiforgeryTokenSet,但我不知道在哪里和如何。我已经尝试在结果过滤器中发出令牌,但是没有运气。

代码语言:javascript
复制
public class SPAAntiforgeryCookieResultFilter : ResultFilterAttribute
    {
        private readonly IAntiforgery _antiforgery;

        public SPAAntiforgeryCookieResultFilter(IAntiforgery antiforgery)
        {
            _antiforgery = antiforgery;
        }

        public override void OnResultExecuting(ResultExecutingContext context)
        {
            Action assignAntiForgery = () =>
            {
                var tokens = _antiforgery.GetAndStoreTokens(context.HttpContext);
                context.HttpContext.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken, new CookieOptions() { HttpOnly = false });
            };

            if (context.Result is ViewResult)
            {
                assignAntiForgery();
            }
            else if (string.Equals(context.ActionDescriptor.ActionName, nameof(AccountController.Login), StringComparison.OrdinalIgnoreCase))
            {
                assignAntiForgery();
            }
        }
    }

ResultExecutingContext似乎不了解经过身份验证的用户,并且仍然为匿名用户颁发令牌。那么,我们如何在登录后重新刷新经过身份验证的用户的防伪RequestToken令牌呢?

EN

回答 1

Stack Overflow用户

发布于 2018-07-20 14:15:41

现在,我找到了如何绕过这个问题的方法。

以前,我在成功登录后返回了Ok(),但是现在我做了RedirectToAction(),为了在RedirectToAction发生后刷新令牌,我的OnResultExecuting过滤器略有改变。

代码语言:javascript
复制
    public class SPAAntiforgeryCookieResultFilter : ResultFilterAttribute
        {
            private readonly IAntiforgery _antiforgery;

            public SPAAntiforgeryCookieResultFilter(IAntiforgery antiforgery)
            {
                _antiforgery = antiforgery;
            }

            public override void OnResultExecuting(ResultExecutingContext context)
            {
                Action assignAntiForgery = () =>
                {
                    var tokens = _antiforgery.GetAndStoreTokens(context.HttpContext);
                    context.HttpContext.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken, new CookieOptions() { HttpOnly = false });
                };

                if (context.Result is ViewResult)
                {
                    assignAntiForgery();
                }
                // Here we check whether our redirect action is executed. Update AFT if it is
                else if (string.Equals(context.ActionDescriptor.RouteValues["action"], nameof(AccountController.RefreshAntiForgeryAfterLogin), StringComparison.OrdinalIgnoreCase))
                {
                    assignAntiForgery();
                }
            }
        }

这个肮脏的黑客在下一种方式下起作用:

  1. 对应用程序->的第一个请求返回AntiForgery、CookieToken和RequestToken (请注意,用户尚未通过身份验证)
  2. 用户按登录到系统-> AntiForgery验证通过,身份验证cookies设置了->用户获得响应的身份验证cookie,状态代码302 (重定向) ->用户使用具有身份验证信息 (User.IsAuthenticated == true)的上下文联系我们的RedirectUserToAction方法。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51442720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档