负载测试IdentityServer4给出异常:在唱歌后尝试请求signin-oidc路由时相关失败

Posted

技术标签:

【中文标题】负载测试IdentityServer4给出异常:在唱歌后尝试请求signin-oidc路由时相关失败【英文标题】:Load testing IdentityServer4 gives Exception: Correlation failed when trying to request signin-oidc route after sing in 【发布时间】:2019-06-06 01:21:56 【问题描述】:

我们正在为我们的应用程序将应用程序移动到 IdentityServer4,我正在尝试使用 Visual Studio 编写负载测试,并且可以通过浏览器在本地计算机上手动运行它,但是当我记录 webtest 并尝试回复它时,我收到异常:关联失败未知位置 Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler.HandleRequestAsync()。

我假设这是因为我在向 signin-oidc 路由发出请求时缺少 .AspNetCore.Correlation.oidc cookie。 Visual Studio 在登录时提取代码、id_token、范围、状态和会话状态。不知道如何调试它,因为它适用于我的浏览器,它只是在通过 Visual Studio 运行 webtest 时不起作用。这可能是录制时的代理问题吗?

任何建议都会有所帮助,找不到太多关于使用 Visual Studio 负载测试登录 Identity Server 4 的负载测试信息。

我尝试从初始请求中提取 nonce 和 state 以将请求放入 sign-oidc,但 Visual Studio 已经从隐藏字段中提取相同的数据。

这是失败的请求,它位于托管 signin-oidc 的 Web 服务器上

回应:

这里是 webtest 请求

它使用来自授权/回调的先前响应中的值,我还确保它们是相同的值,唯一一个不完全相同的值,其中范围有一个 + 符号而不是空格,所以我将编码设置为 false 以确保它们相同。

由于手动进入时浏览器正在从上一个请求中进行发布,而 webtest 不是从浏览器中进行发布,它只是发出发布请求,这可能会搞砸一些事情吗?

当我手动通过 fiddler 时,该请求具有 webtest 没有的以下 cookie:

这很可能是网络服务器抛出错误的原因,但我不确定该 cookie 的设置位置以及您是否可以通过 webtest 进行设置。

【问题讨论】:

你从哪里得到异常?在 Visual Studio 中?在服务器?作为 HTTP 响应中的文本?别的地方?我认为您需要提供更多关于您发送的请求和失败请求的详细信息。 Visual Studio 会重放记录的请求,并且当记录器找到(即关联)一些动态数据时,它并没有全部找到它们。 Web 测试开发通常意味着发现和关联其他值。 我更新了有关失败的请求/响应的更多信息。在 Web 服务器上失败。 webtest 正在从身份服务器中提取上一个请求的隐藏输入类型,即连接/授权/回调。 我怀疑 " webtest 是否正在提取上一个请求的隐藏输入类型",而是我怀疑它们是记录的值。根据我之前的评论,您需要在较早的响应中找到正确的值,将它们提取到上下文参数 (CP) 中,并在失败的请求中使用这些 CP。或许您应该研究一下如何开发 Web 测试以及如何处理动态数据。 我添加了显示它使用以下响应提供的 Hidden 参数的请求。我已经在需要时提取了大量动态数据,但 Visual Studio 正在处理这一点,我已经验证了这一点。 【参考方案1】:

我能够从第一个请求的响应中获取 .AspNetCore.Correlation.oidc 和 .AspNetCore.OpenIdConnect.Nonce cookie

我必须添加一个自定义提取规则以从标头中获取这些 cookie 并将它们保存在上下文中(以在 singin-oidc 请求中使用)。 然后在对 signin-oidc 的请求上,我做了一个 webtest 插件并添加了 PreRequest 方法来添加从第一个请求中提取的上下文中的 cookie。

执行此操作后,我没有收到与身份相关的错误,并且从响应中设置了正确的 cookie,当我调用使用刷新令牌获取访问令牌时,我能够获取令牌将其设置为不记名令牌以调用其他 API。

如果标头设置了 cookie,我觉得我不需要从第一个响应中提取 cookie,但是由于它是 302 重定向,因此有一些依赖请求也在设置 cookie。

我不知道这是否会覆盖上一个请求中设置的那些(我需要的那些,比如 nonce 和相关性)。我还必须取消关注依赖请求,并从第一个请求的 302 中提取 Location Header 并手动发出下一个请求。

如果其他人正在编写 Web 测试以登录 IdentityServer4 并找到不同的解决方案,请告诉我。

【讨论】:

根据我的经验,Visual Studio 处理 cookie 没有任何问题。然而,Identity Server 可能会做一些 Visual Studio 没有预料到的事情。很好地找到了解决方案,感谢您在此处记录它。

以上是关于负载测试IdentityServer4给出异常:在唱歌后尝试请求signin-oidc路由时相关失败的主要内容,如果未能解决你的问题,请参考以下文章

我的 AspNet Core 3.1 身份页面在 IdentityServer4 中给出 404。我怎样才能访问这些?这是路线问题吗?

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

我无法在 XMPP 服务器中使用 jmeter 进行负载测试,我添加了所有插件并给出了 xmpp 连接、用于连接登录的采样器以及所有

无效的签名密钥 IdentityServer4

IdentityServer4如何创建身份令牌?

Identity Server 4 Silent Renew 错误响应:login_required