1

我有一个调用 OData API 的 Angular 4 服务。我的 API 设置可以使用 Windows 身份验证,这可以通过 IE(版本 11)工作,但不适用于 Chrome,它会抛出:

加载资源失败:服务器响应状态为 401(未授权)

紧随其后的是:

XMLHttpRequest 无法加载http://gbldnrgaptest1:53219/User。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问源“ http://gap ”。响应具有 HTTP 状态代码 401。

我使用以下方法为发送的每个请求创建选项:

private GetOptions(): RequestOptionsArgs{
    let options : RequestOptionsArgs;
    options = {
        headers : this.GetHeaders(),
        withCredentials: true
    };

    return options;
}

private GetHeaders(): Headers {
    let headers = new Headers();
    headers.append("OData-Version","4.0");
    headers.append("Content-Type","application/json;odata.metadata=minimal");
    headers.append("Accept","application/json");
    return headers;
}

在我的 API 上,我启用了 CORS:

var cors = new EnableCorsAttribute(origins: "*", headers: "*", methods: "*", exposedHeaders: "*")
    {
        SupportsCredentials = true
    };
    config.EnableCors(cors);       

我还在 web.config 中启用了 Windows 身份验证:

<system.web>
  <compilation debug="true" targetFramework="4.5" />
  <httpRuntime targetFramework="4.5" />
  <authentication mode="Windows"></authentication>
</system.web>

我的 IIS 也设置为仅允许 Windows Auth:

在此处输入图像描述

有人知道我可能会错过什么吗?

我觉得这是一个标题问题;当我在 Chrome 中简单地运行一个获取请求时,例如通过导航到http://gbldnrgaptest1:53219/User它返回就好了,一旦我添加了 NTLM 身份验证,SOAP UI 也可以工作。

4

1 回答 1

0

让它工作,我必须做以下事情:

将以下内容添加到 Web.Config:

<authorization>
  <allow verbs="OPTIONS" users="*"/>
  <deny users="?" />
</authorization>

这是因为发出的飞行前请求显然没有发送凭据,这导致了错误的发生。既然设置了上述规则,则需要重新打开匿名身份验证;然后,Web.Config 中设置的规则将过滤通过的内容,只允许匿名完成 OPTIONS 请求。

于 2017-07-10T13:07:45.423 回答