我正在尝试开发一个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正在按预期生成,直到最后一步。
你能告诉我我可能做错了什么吗?先谢谢你了。
1条答案
按热度按时间ogq8wdun1#
如果你完全确定你的最后一个请求是正确的,并且你正确地关联了每个动态值,因为最后一个请求是一个重定向,那么使用Location头中的URL重复它就足够了。
或者,最有可能是你的最后一个请求格式不正确,交叉检查它与真实的浏览器发送的请求,并确保它看起来完全相同(除了需要关联的动态值)。最好使用第三方嗅探器工具,如Fiddler或Wireshark,这样您就可以并排比较请求。
最可疑的部分是
NewUser=1
,如果您使用现有用户登录,我希望它是0
。我也不认为你需要在最后一次请求时发送
ctx
和canary
参数的值(但是你的应用程序可能会配置不同)。您可以查看How to Run Performance Tests on OAuth Secured Apps with JMeter文章的一般内容,特别是atlassian-microsoft-oauth.jmx示例测试计划。