【问题标题】:How to call API with AntiForgeryToken using Postman in IdentityServer ASP.NET Core如何在 IdentityServer ASP.NET Core 中使用 Postman 使用 AntiForgeryToken 调用 API
【发布时间】:2018-11-12 09:51:31
【问题描述】:

我正在尝试使用 Postman 使用 Identity Server Asp.net Core 测试我的 API。

这是我正在尝试做的方式:

  1. 第一个请求 HttpGethttps://localhost:5000/Account/Login 并在响应正文中收到:<input name="__RequestVerificationToken" type="hidden" value="CfDJ8MoS9upoM4dNp8Kx-AdvA-uYr13_PAkuMZpzYMV8UmxZq5GdLTvN-Ht5NpTLmPtlhL5d5z2Hu2vUJoJGhk1AMlARDcOwqgq7Cef1dfQL_vl4tIFM4kx9RZPz8DHU26-U9qLnKAIstZgR42-1FuGNh24" />

在 Cookie 中(虽然不确定它是什么):

  1. 然后HttpPosthttps://localhost:5000/Account/LoginRequestVerificationToken 以及从正文HttpGet 请求中收到的令牌。

并且总是error 400,正如您在上面的屏幕截图中看到的那样。

在 Visual Studio 中,我可以看到一些请求被捕获,但显然是不正确的。

如果我要删除属性[ValidateAntiForgeryToken],那么当然一切正常,但显然是因为该验证被禁用。

【问题讨论】:

  • 输入字段名称为__RequestVerificationToken。注意开头的双下划线。
  • 对,我之前用 __ 尝试过,同样的问题出现了。
  • 你是否将它包含在正文中?它是一个表单域,而不是一个标题。
  • 是的,我也在尝试身体。
  • 他需要它来获取承载令牌并能够将这些承载令牌添加到他的 API 请求中,以便他可以测试具有 [Authorize] 属性的方法。我也有同样的问题。

标签: asp.net-core asp.net-identity postman identityserver4


【解决方案1】:

您需要执行以下操作才能发送此类请求:

1.) 在 x-www-form-urlencoded 中输入 __RequestVerificationToken 键值(不要忘记双下划线)

2.) 您需要将 .AspNetCore.Antiforgery cookie 添加到 Postman 的 Cookies 部分。

例如像这样 .AspNetCore.Antiforgery.1XHiLFgQI2w=你的cookie值;路径=/;域=localhost;Expires=Session;

您可以在 Google 开发者工具的应用程序部分找到 .AspNetCore.Antiforgery cookie

.AspNetCore.Antiforgery cookie in Google Developer Tools picture

Add cookie in Postman picture

【讨论】:

    【解决方案2】:

    只是在这上面花了很多时间。

    我做了几件事:

    1. 设置环境并添加变量。
    2. 添加了一个预请求脚本...
      • 使用 pm.SendRequest 获取页面
      • 使用cheerio 查找名为__RequestVerificationToken 的第一个输入字段并获取其值
      • 将环境变量设置为从字段中检索到的值
    3. 发送表单数据(因为我使用的是 asp.net core,模型的值),如 x-www-form-urlencoded
    4. 最后但同样重要的是,我在表单数据中添加了 __RequestVerificationToken 作为键值对之一,并将其​​设置为使用已设置的变量

    我发布此答案的主要原因是最后一个,我在网上看到很多东西表明名称应该是 RequestVerificationToken,但这不起作用,只会导致 400 响应(错误请求)。

    【讨论】:

    • 绝妙的解决方案!
    • 绝对认为这可能会绕过 CSRF 保护。如果在浏览器上下文中实现(我们试图保护的东西),如果服务器也启用了 CORS,则同样的技术不起作用。
    【解决方案3】:

    在邮递员中,您需要将内容类型设置为形成 url 编码。

    并在标头中将请求验证令牌作为“RequestVerificationToken”发送

    但是,如果您只需要 Bearer 令牌,那么您需要调用 POST https://<your identity server>/connect/token

    【讨论】:

      猜你喜欢
      • 2020-05-20
      • 2019-04-27
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      • 2020-01-08
      • 2021-08-25
      • 1970-01-01
      • 2022-12-28
      相关资源
      最近更新 更多