Orchestrator 身份验证不适用于 Javascript XHR 请求
Orchestrator Authentication not working with Javascript XHR request
我尝试建立一个可以在内部控制我们的 UiPath Orchestrator 的网站。我们正在使用内部部署的 Orchestrator。
连接在 Postman/curl 中首次测试:
curl --location --request POST '{{url}}/api/Account/Authenticate' \
--header 'Content-Type: application/json' \
--data-raw '{
"tenancyName": "{{tenantName}}",
"usernameOrEmailAddress": "{{usernameOrEmailAddress}}",
"password": "{{password}}"
}'
这让我毫无问题地返回了 authtoken
。完美。
然后我尝试将 curl
实现为 Javascript 中的 XHR
:
var data = JSON.stringify({"tenancyName":"...","usernameOrEmailAddress":"...","password":"..."});
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});
xhr.open("POST", "https://.../api/account/authenticate");
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(data);
但是 Firefox 和 Chrome 正在尝试预检。所以我得到了一个 404 状态码:
火狐:
Chrome:
我现在很困惑如何修复它。实际上这显然是一个 CORS 问题。所以我试着设置:
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
在我们的 IIS7 服务器上。没有任何变化。
我还尝试将此设置设置为允许 Node.js 服务器和 XHR 请求上的所有内容。但 404 留下来了。
然后我尝试使用 Chrome 和 Firefox 插件来禁用 CORS。但 404 留下来了。
在 Postman 中,自第一次尝试以来它再次完美运行。所以这只是一个 CORS 问题。但我想让 CORS 启用,也许只是以允许特定服务器的方式配置它。怎么做?
一种解决方案是使用 non-preflight 请求:
var data = "tenancyName=...&usernameOrEmailAddress=...&password=...";
var xhr = new XMLHttpRequest();
xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});
xhr.open("POST", "https://url/api/account/authenticate");
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(data);
由于 "Content-Type", "application/x-www-form-urlencoded"
是 non-preflight 之一,我们只是用它来躲避 CORS 机制。可以肯定的是,data
变量已更改,因此 JSON.stringify
现在消失了。
由于 UiPath Orchestrator 服务器位于私有 Azure 环境中,这根本不是一个大的安全问题。
无论如何,仍然欢迎在 IIS7 服务器上完全禁用 CORS 的解决方案。
另一个解决方案是 在 IIS10 上禁用 cors。
但请确保这仅用于测试,并且只有当您 运行 它 non-public 时才会安全!稍后您应该再次启用它并限制为您使用的域。
第二步是将此行添加到 IIS10 服务器的 web.config 文件中:
<configuration>
<system.webServer>
<cors enabled="true" failUnlistedOrigins="true">
<add origin="*">
<allowHeaders allowAllRequestedHeaders="true" />
</add>
</cors>
</system.webServer>
</configuration>
我尝试建立一个可以在内部控制我们的 UiPath Orchestrator 的网站。我们正在使用内部部署的 Orchestrator。
连接在 Postman/curl 中首次测试:
curl --location --request POST '{{url}}/api/Account/Authenticate' \
--header 'Content-Type: application/json' \
--data-raw '{
"tenancyName": "{{tenantName}}",
"usernameOrEmailAddress": "{{usernameOrEmailAddress}}",
"password": "{{password}}"
}'
这让我毫无问题地返回了 authtoken
。完美。
然后我尝试将 curl
实现为 Javascript 中的 XHR
:
var data = JSON.stringify({"tenancyName":"...","usernameOrEmailAddress":"...","password":"..."});
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});
xhr.open("POST", "https://.../api/account/authenticate");
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(data);
但是 Firefox 和 Chrome 正在尝试预检。所以我得到了一个 404 状态码:
火狐:
Chrome:
我现在很困惑如何修复它。实际上这显然是一个 CORS 问题。所以我试着设置:
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
在我们的 IIS7 服务器上。没有任何变化。
我还尝试将此设置设置为允许 Node.js 服务器和 XHR 请求上的所有内容。但 404 留下来了。
然后我尝试使用 Chrome 和 Firefox 插件来禁用 CORS。但 404 留下来了。
在 Postman 中,自第一次尝试以来它再次完美运行。所以这只是一个 CORS 问题。但我想让 CORS 启用,也许只是以允许特定服务器的方式配置它。怎么做?
一种解决方案是使用 non-preflight 请求:
var data = "tenancyName=...&usernameOrEmailAddress=...&password=...";
var xhr = new XMLHttpRequest();
xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(this.responseText);
}
});
xhr.open("POST", "https://url/api/account/authenticate");
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(data);
由于 "Content-Type", "application/x-www-form-urlencoded"
是 non-preflight 之一,我们只是用它来躲避 CORS 机制。可以肯定的是,data
变量已更改,因此 JSON.stringify
现在消失了。
由于 UiPath Orchestrator 服务器位于私有 Azure 环境中,这根本不是一个大的安全问题。
无论如何,仍然欢迎在 IIS7 服务器上完全禁用 CORS 的解决方案。
另一个解决方案是 在 IIS10 上禁用 cors。
但请确保这仅用于测试,并且只有当您 运行 它 non-public 时才会安全!稍后您应该再次启用它并限制为您使用的域。
第二步是将此行添加到 IIS10 服务器的 web.config 文件中:
<configuration>
<system.webServer>
<cors enabled="true" failUnlistedOrigins="true">
<add origin="*">
<allowHeaders allowAllRequestedHeaders="true" />
</add>
</cors>
</system.webServer>
</configuration>