【问题标题】:Handle AntiForgery Token in Winform and WebAPI在 Winform 和 WebAPI 中处理 AntiForgery 令牌
【发布时间】:2013-01-06 05:30:08
【问题描述】:

在从非浏览器客户端调用时,在具有 ValidateAntiForgeryTokenAttribute 属性的方法上处理 Antiforgery 的最佳方法是什么,例如 WinForm

据我所知,以下是防伪的工作原理:

  1. 一个隐藏的输入字段被添加到页面,例如

  2. 一个同名的cookie也被发送到客户端

  3. 在下一个请求中,cookie 和隐藏的输入字段都被发送到服务器。服务器调用AntiForgery.Validate(token, cookie) 确认请求合法。

在网络应用程序中一切正常。它似乎在 WinForm 中不起作用。这是我的工作:

  1. 使用HttpClient,我可以访问包含令牌的页面。
  2. 我解析页面并抓取隐藏的输入字段。我也拿起饼干。
  3. 我按原样传递 cookie。最重要的是,我添加了一个新标题 __RequestVerificationToken,其中包含来自隐藏字段的值。
  4. 我进入服务器代码。
  5. AntiForgery.Validate(xx,yy) 失败并出现错误: 提供的防伪令牌是为用户 X 准备的,但当前用户是 Y。

【问题讨论】:

  • 您在此序列中的哪个时间点进行身份验证? (如果有的话)。当您在身份验证之前检索令牌然后将令牌发回(这次是经过身份验证的会话)时,往往会发生此错误。

标签: winforms asp.net-web-api antiforgerytoken


【解决方案1】:

我想通了。它需要事先完成表单身份验证,并在随后的 WebAPI 调用中传递 cookie。所以这是修改后的流程:

1) 使用 HttpWebRequest (GET) 加载登录表单

2) 使用凭据在登录表单上执行 POST。请在 HttpWebRequest 中提供 cookiecontainer

3) cookiecontainer 现在包含 Auth cookie 和 __RequestVerificationToken

4) 从任何后续 GET 甚至从登录结果的输出中获取 __RequestVerificationToken

5) 对于 WebAPI Post 调用,按原样传递 cookiecontainer。还包括一个 header __RequestVerificationToken ,其值来自上一步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 2012-04-10
    • 1970-01-01
    • 2015-02-06
    • 2017-04-15
    相关资源
    最近更新 更多