如何在 IdentityServer ASP.NET Core 中使用 Postman 使用 AntiForgeryToken 调用 API
Posted
技术标签:
【中文标题】如何在 IdentityServer ASP.NET Core 中使用 Postman 使用 AntiForgeryToken 调用 API【英文标题】:How to call API with AntiForgeryToken using Postman in IdentityServer ASP.NET Core 【发布时间】:2018-11-12 09:51:31 【问题描述】:我正在尝试使用 Postman 使用 Identity Server Asp.net Core 测试我的 API。
这是我正在尝试做的方式:
-
第一个请求
HttpGet
到 https://localhost:5000/Account/Login 并在响应正文中收到:<input name="__RequestVerificationToken" type="hidden" value="CfDJ8MoS9upoM4dNp8Kx-AdvA-uYr13_PAkuMZpzYMV8UmxZq5GdLTvN-Ht5NpTLmPtlhL5d5z2Hu2vUJoJGhk1AMlARDcOwqgq7Cef1dfQL_vl4tIFM4kx9RZPz8DHU26-U9qLnKAIstZgR42-1FuGNh24" />
在 Cookie 中(虽然不确定它是什么):
-
然后
HttpPost
到https://localhost:5000/Account/Login 和RequestVerificationToken
以及从正文HttpGet
请求中收到的令牌。
并且总是error 400
,正如您在上面的屏幕截图中看到的那样。
在 Visual Studio 中,我可以看到一些请求被捕获,但显然是不正确的。
如果我要删除属性[ValidateAntiForgeryToken]
,那么当然一切正常,但显然是因为该验证被禁用。
【问题讨论】:
输入字段名称为__RequestVerificationToken
。注意开头的双下划线。
对,我之前用 __ 尝试过,同样的问题出现了。
你是否将它包含在正文中?它是一个表单域,而不是一个标题。
是的,我也在尝试身体。
他需要它来获取承载令牌并能够将这些承载令牌添加到他的 API 请求中,以便他可以测试具有 [Authorize] 属性的方法。我也有同样的问题。
【参考方案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】:只是在这上面花了很多时间。
我做了几件事:
-
设置环境并添加变量。
添加了一个预请求脚本...
使用 pm.SendRequest 获取页面
使用cheerio 查找名为__RequestVerificationToken 的第一个输入字段并获取其值
将环境变量设置为从字段中检索到的值
发送表单数据(因为我使用的是 asp.net core,模型的值),如 x-www-form-urlencoded
最后但同样重要的是,我在表单数据中添加了 __RequestVerificationToken 作为键值对之一,并将其设置为使用已设置的变量
我发布此答案的主要原因是最后一个,我在网上看到很多东西表明名称应该是 RequestVerificationToken,但这不起作用,只会导致 400 响应(错误请求)。
【讨论】:
绝妙的解决方案! 绝对认为这可能会绕过 CSRF 保护。如果在浏览器上下文中实现(我们试图保护的东西),如果服务器也启用了 CORS,则同样的技术不起作用。【参考方案3】:在邮递员中,您需要将内容类型设置为形成 url 编码。
并在标头中将请求验证令牌作为“RequestVerificationToken”发送
但是,如果您只需要 Bearer 令牌,那么您需要调用
POST https://<your identity server>/connect/token
与
【讨论】:
以上是关于如何在 IdentityServer ASP.NET Core 中使用 Postman 使用 AntiForgeryToken 调用 API的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Thinktecture.IdentityServer.45 在令牌中返回多个身份?
如何使用 IdentityServer 4 实现 Windows 身份验证
如何测试我的令牌是不是使用 IdentityServer4 刷新?