在Winform和Web API中处理AntiForgery令牌

时间:2013-01-22 20:53:42

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

从非浏览器客户端调用时,使用ValidateAntiForgeryTokenAttribute属性处理具有WinForm属性的方法的最佳方法是什么?比如AntiForgery.Validate(token, cookie)

根据我所知,以下是防伪的工作方式:

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

  2. 同样名称的cookie也会发送到客户端

  3. 在下一个请求中,cookie和隐藏的输入字段都将发送到服务器。服务器调用HttpClient以确认请求是合法的。

  4. 一切都可以在网络应用中正常使用。它似乎在WinForm中不起作用。这是我的工作:

    1. 使用__RequestVerificationToken,我会转到包含令牌的页面。
    2. 我解析页面并抓取隐藏的输入字段。我也拿起了饼干。
    3. 我按原样传递cookie。最重要的是,我使用隐藏字段中的值添加了一个新标题AntiForgery.Validate(xx,yy)
    4. 我进入服务器代码。
    5. {{1}}失败并显示错误: 提供的防伪令牌适用于用户X,但当前用户为Y.

1 个答案:

答案 0 :(得分:3)

我明白了。它需要先进行表单身份验证,然后在后续的WebAPI调用中传递cookie。所以这是修改后的流程:

1)使用HttpWebRequest(GET)

加载登录表单

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

3)cookiecontainer现在包含Auth cookie和 __ RequestVerificationToken

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

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