如何在 IdentityServer ASP.NET Core 中使用 Postman 调用带有 AntiForgeryToken 的 API。

15

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

我尝试的方式如下:

  1. 首先发起 HttpGet 请求到 https://localhost:5000/Account/Login,并在响应体中接收到:
<input name="__RequestVerificationToken" type="hidden" value="CfDJ8MoS9upoM4dNp8Kx-AdvA-uYr13_PAkuMZpzYMV8UmxZq5GdLTvN-Ht5NpTLmPtlhL5d5z2Hu2vUJoJGhk1AMlARDcOwqgq7Cef1dfQL_vl4tIFM4kx9RZPz8DHU26-U9qLnKAIstZgR42-1FuGNh24" />

在Cookie中(虽然不确定是什么): enter image description here 2. 然后使用HttpPost方法向https://localhost:5000/Account/Login发送请求,带上从HttpGet请求的响应体中获取的RequestVerificationTokenenter image description here 并且始终返回400错误,如上面的截图所示。
在Visual Studio中,我可以看到某些请求被捕获,但显然是错误的。 enter image description here 如果我移除[ValidateAntiForgeryToken]属性,那当然一切都正常工作,但显然,因为验证被禁用了。

输入字段名称为 __RequestVerificationToken。请注意开头的双下划线。 - Brad
没错,我之前尝试过使用__,但是出现了同样的问题。 - DiPix
你是在正文中包含它吗?这是一个表单字段,不是一个头部。 - Brad
是的,我也在尝试这个方法。 - DiPix
1
他需要它来获取Bearer令牌,并能够将这些Bearer令牌添加到他的API请求中,以便他可以测试具有[Authorize]属性的方法。我也有同样的问题。 - axelrotter
显示剩余2条评论
3个回答

5

要发送这样的请求,您需要执行以下操作:

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

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

例如: .AspNetCore.Antiforgery.1XHiLFgQI2w=your cookie value; Path=/; Domain=localhost;Expires=Session;

您可以在Google开发者工具的Application部分中找到.AspNetCore.Antiforgery cookie。

在Google开发者工具中查找.AspNetCore.Antiforgery cookie图片

在Postman中添加cookie图片


1
太好了!@Burhan Savci提供了巨大的帮助!这应该被标记为正确答案。请注意,.AspNetCore.Antiforgery可能会因您所命名的不同而有所不同。对我来说,它是__AFC。 - Andy
谢谢您的评论,@Andy。是的,您说得对,您可以更改防伪 cookie 的默认名称 (.AspNetCore.Antiforgery)。在这个例子中,我使用了默认名称。 - Burhan Savci

1

我花了很多时间做了以下几件事情:

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

我发表这个答案的主要原因是最后一个步骤。我看到很多网络上的东西表明该名称应该是RequestVerificationToken,但那样行不通,只会导致400响应(错误的请求)。


绝妙的解决方案! - Cameron Wilby
肯定认为这可能绕过CSRF保护。如果在浏览器上下文中实现(我们正在尝试保护的东西),如果服务器也启用了CORS,则此相同技术无法正常工作。 - Cameron Wilby

-2
在Postman中,您需要将内容类型设置为表单URL编码。
并将请求Verification Token作为“RequestVerificationToken”发送到标头中
但是,如果您只需要一个Bearer令牌,那么您需要调用 POST https://<your identity server>/connect/token并使用 enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接