3

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。
4

1 回答 1

3

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

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

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

3) cookiecontainer 现在包含 Auth cookies 和 __RequestVerificationToken

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

5) 对于 WebAPI Post 调用,按原样传递 cookiecontainer。还包括一个标头__RequestVerificationToken ,其中包含上一步中的值。

于 2013-01-23T21:51:58.793 回答