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 时才会安全!稍后您应该再次启用它并限制为您使用的域。

第一install the Cors module.

第二步是将此行添加到 IIS10 服务器的 web.config 文件中:

<configuration>
    <system.webServer>
        <cors enabled="true" failUnlistedOrigins="true">
          <add origin="*">
            <allowHeaders allowAllRequestedHeaders="true" />
          </add>
        </cors>
    </system.webServer>
</configuration>