Azure身份验证在明显正确的关联后在JMeter中不起作用

2j4z5cfb  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(152)

我正在尝试开发一个JMeter脚本,用于使用Azure(Oauth2)身份验证测试应用程序的性能。现在我被自动化的登录过程卡住了。
以下是我在脚本中提出的相关要求:
1.进入登录界面:GET https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/authorize,参数如下:

  • sso_reload=true
  • scope=openid配置文件offline_access https://graph.microsoft.com/user.read
  • response_type=代码
  • redirect_uri=https://${server}/azure-ad-interface-provider/login/getAuthCode
  • state=${state}(在上一步中捕获)
  • nonce=${nonce}(在上一步中捕获)
  • client_id=${client_id}(在上一步中捕获)
  • response_mode=query

从这个请求中,我捕获了以下参数以供稍后使用:

  • sCtx
  • flowToken
  • 金丝雀
  • 顶端的
  • hpgrequest-id
  • 客户端请求id

1.用户名:POST https://login.microsoftonline.com/common/GetCredentialType?mkt=en-US使用以下JSON正文:{“username”:“${username}",“isOtherIdpSupported”:true,“checkPhones”:false,“isRemoteNGCSupported”:true,“isCookieBannerShowed”:false,“isFidoSupported”:true,“originalRequest”:“${sCtx}",“country”:“${country}",“forceotclogin”:false,“isExternalFederationDisallowed”:false,“isRemoteConnectSupported”:false,“federationFlags”:0,“isSignup”:false," Supported Token”:${flowToken}“,“isPassAccessAccess”:true}
这个请求有一个正确的响应,一个JSON,其中包含有关用户和要打开的会话的信息。
1.输入密码:使用以下参数POST https://login.microsoftonline.com/{tenant_id}/login

  • PPSX
  • IsFidoSupported=1
  • ps=2
  • hisScaleUnit=
  • hpgrequestid=${hpgrequestid}
  • i13=0
  • 登录=${username}
  • 类型=11
  • 登录选项=3
  • flowToken=${flowToken}
  • psRNGC熵=
  • 登录infmt =${用户名}
  • isSignupPost=0
  • 新用户=1
  • Canary=${canary}
  • hisRegion
  • ctx=${sCtx}
  • psRNGCDefaultType=
  • CookieDisclosure=0
  • lrtPartition=
  • i21=0
  • Lrt=
  • psRNGCSLK=
  • passwd=${password}
  • FoundMSA =
  • fspost=0

这个请求应该返回一个如下的响应:

<!-- Copyright (C) Microsoft Corporation. All rights reserved. -->
<!DOCTYPE html>
<html dir="ltr" class="" lang="es">
<head>
    <title>**Sign into the account**</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=2.0, user-scalable=yes">
    <meta http-equiv="Pragma" content="no-cache">
    <meta http-equiv="Expires" content="-1">
    <link rel="preconnect" href="https://aadcdn.msftauth.net" crossorigin>
<meta http-equiv="x-dns-prefetch-control" content="on">
<link rel="dns-prefetch" href="//aadcdn.msftauth.net">
<link rel="dns-prefetch" href="//aadcdn.msauth.net">

    <meta name="PageID" content="**ConvergedTFA**" />
...

并且该请求还应该返回持久cookie,该持久cookie将由脚本使用以保持会话打开。
然而,它正在回归:

<!-- Copyright (C) Microsoft Corporation. All rights reserved. -->
<!DOCTYPE html>
<html dir="ltr" class="" lang="es">
<head>
    <title>**Redirecting**</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=2.0, user-scalable=yes">
    <meta http-equiv="Pragma" content="no-cache">
    <meta http-equiv="Expires" content="-1">
    <meta name="PageID" content="**BssoInterrupt**" />
...

而且不会退回饼干。因此,脚本在下一步中失败,因为没有有效地执行登录。我也在使用Cookie管理器。实际上,其余的cookie正在按预期生成,直到最后一步。
你能告诉我我可能做错了什么吗?先谢谢你了。

ogq8wdun

ogq8wdun1#

如果你完全确定你的最后一个请求是正确的,并且你正确地关联了每个动态值,因为最后一个请求是一个重定向,那么使用Location头中的URL重复它就足够了。
或者,最有可能是你的最后一个请求格式不正确,交叉检查它与真实的浏览器发送的请求,并确保它看起来完全相同(除了需要关联的动态值)。最好使用第三方嗅探器工具,如FiddlerWireshark,这样您就可以并排比较请求。
最可疑的部分是NewUser=1,如果您使用现有用户登录,我希望它是0
我也不认为你需要在最后一次请求时发送ctxcanary参数的值(但是你的应用程序可能会配置不同)。
您可以查看How to Run Performance Tests on OAuth Secured Apps with JMeter文章的一般内容,特别是atlassian-microsoft-oauth.jmx示例测试计划。

相关问题