我试图建立一个网站,以在内部控制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状态码:
Firefox:
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启用,也许只是以允许特定服务器的方式配置它。该怎么做?
答案 0 :(得分:0)
一种解决方案是使用非预检请求:
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"
是不安全的事情之一,因此我们只是用它来躲避CORS机制。并且可以肯定,data
变量已更改,因此JSON.stringify
现在消失了。
由于UiPath Orchestrator服务器位于私有Azure环境中,所以这根本不是一个很大的安全问题。
无论如何,仍然欢迎在IIS7服务器上完全禁用CORS的任何解决方案。
答案 1 :(得分:0)
另一种解决方案是在IIS10上禁用cors 。
但是请确保这仅用于测试,并且仅在非公开运行时才是安全的!稍后,您应该再次启用它并限制为您使用的域。
第二步是将此行添加到IIS10服务器的web.config文件中:
<configuration>
<system.webServer>
<cors enabled="true" failUnlistedOrigins="true">
<add origin="*">
<allowHeaders allowAllRequestedHeaders="true" />
</add>
</cors>
</system.webServer>
</configuration>