如何在 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 在令牌中返回多个身份?

如何在 IdentityServer4 上添加电话号码声明

如何使用 IdentityServer 4 实现 Windows 身份验证

如何测试我的令牌是不是使用 IdentityServer4 刷新?

IdentityServer4 如何在授权代码流中存储和更新令牌

如何让 IdentityServer 与 AddDbContextPool 一起工作