【发布时间】:2019-03-30 10:58:48
【问题描述】:
我有一个带有 Angular 前端和 Asp.Net Web 服务的应用程序。我正在使用 Angular 中的 HttpClient 实体进行 Web 服务调用。我已经配置了 CORS,并且我的 GET 使用以下基本结构在整个应用程序中完美运行
let url = environment.base_url + 'api/SubDoc/GetDocument?docID=' + docID;
this.httpClient.get(url,
{
withCredentials: true
})
.subscribe(
response => {
console.log(response);
newData = response;
this.currentDocument = newData;
}
);
我已经证明 CORS 可以正常工作,因为只要我在调用 EnableCors 时正确编辑 Origin 值,我就可以从我的本地主机会话或运行在我们的 QA 和生产服务器上的应用程序会话访问相同的服务端点
config.EnableCors(new EnableCorsAttribute(origins: "http://localhost:2453,http://localhost:2452,http://***,http://10.100.101.46", headers: headers, methods: methods) { SupportsCredentials = true });
标头和方法定义为以下字符串:
headers = "Origin, Content-Type, X-Auth-Token, content-type,application/x-www-form-urlencoded";
methods = "GET,PUT,POST,OPTIONS,DELETE";
但是,我无法使用以下 HttpClient 结构向同一服务发出 PUT 请求
let url = this.base_url + 'api/ContactGroup/Put';
// Try the new HttpClient object
this.httpClient.put(url, body,
{
headers: new HttpHeaders({ 'Content-Type': 'application/json' }),
withCredentials: true
})
.subscribe(
response=>{
let temp:number;
temp = parseInt(response.toString(),10);
if(!isNaN(temp)){
this.groupID = temp;
}
}
);
当我从同一服务器连接时(即没有适用的 CORS),此 PUT 请求运行完美,但当我尝试从任何其他服务器连接时失败并出现预检错误。
未能加载 http://***/api/ContactGroup/Put:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://localhost:2452' 不允许访问。
如上所述,我确实定义了 Access-Control-Allow-Origin 标头,并且我相信我已将 PUT 和 OPTIONS 作为支持的方法包含在内。
我认为问题与未发送凭据的 PUT 请求有关。 GET 请求在请求标头中有一个凭证项,但 PUT 没有,即使我使用的是 withCredentials 选项。
PUT 请求的标头如下所示:
Request URL: http://reitgc01/REITServicesQA/api/ContactGroup/Put
Request Method: OPTIONS
Status Code: 401 Unauthorized
Remote Address: 10.100.101.46:80
Referrer Policy: no-referrer-when-downgrade
Content-Type: text/html
Provisional headers are shown
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: PUT
DNT: 1
Origin: http://localhost:2452
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
我现在已经在这个问题上花费了数天时间,如果能提供任何帮助,我们将不胜感激。
【问题讨论】:
-
您需要为
http://reitgc01/REITServicesQA/api/ContactGroup/Put端点配置 ASP.Net 服务器后端,以使 OPTIONS 请求不需要身份验证凭据。显示的请求标头表明浏览器在尝试来自前端代码的 PUT 请求之前正在发送 CORS 预检 OPTIONS 请求。并且预检失败并返回 401 响应,因为服务器需要身份验证,但浏览器在该 OPTIONS 请求中不包含身份验证凭据 - 因为 CORS 规范要求浏览器在没有凭据的情况下发出请求。 -
感谢您的反馈,这是解决方案的一个很好的开始。我确实有澄清的问题。我们正在使用 IIS,并且我们禁用了匿名身份验证,因为这是一个使用集成身份验证的 Intranet 站点。我已经阅读了一些关于 Web.config 中自定义配置的帖子,以便仅在 OPTIONS 上启用匿名或在 begin_request 方法中编写自定义处理程序。您是否有使用这两种方法的经验,并且您是否曾经为集成安全站点做过这项工作?