Angularjs 也就是说:";在访问控制允许原点标题“中找不到原点”;使用启用CORS的.NET Core和Angular 2

Angularjs 也就是说:";在访问控制允许原点标题“中找不到原点”;使用启用CORS的.NET Core和Angular 2,angularjs,internet-explorer,angular,cors,.net-core,Angularjs,Internet Explorer,Angular,Cors,.net Core,我正在构建一个内部应用程序,使用Angular 2(CLI/Webpack)调用我使用.NET Core构建的支持CORS的服务。该服务使用用户的集成Windows身份验证凭据来查找有关该用户的信息并将其返回给用户。在Chrome和Firefox中一切正常,但在IE10和IE11中,我收到一个“401未经授权”的响应,并显示消息来源Originhttp://localhost:4200 在访问控制允许源标题中找不到。 在Angular中,我正在进行如下HTTP调用: private option

我正在构建一个内部应用程序,使用Angular 2(CLI/Webpack)调用我使用.NET Core构建的支持CORS的服务。该服务使用用户的集成Windows身份验证凭据来查找有关该用户的信息并将其返回给用户。在Chrome和Firefox中一切正常,但在IE10和IE11中,我收到一个“401未经授权”的响应,并显示消息来源
Originhttp://localhost:4200 在访问控制允许源标题中找不到。

在Angular中,我正在进行如下HTTP调用:

private options = new RequestOptions({withCredentials: true});    

let getURL = `server:port/api/users/username`;
return this.http
    .get(getURL, this.options)
    .map((response: Response) => response.json()[0])
    .catch(this.handleError);
我的.NET核心服务在Startup.cs中使用以下代码:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("policyAnyone",
            builder => {
                builder.AllowCredentials()
                .AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader();
            });
    });

    services.AddApplicationInsightsTelemetry(Configuration);

    services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    app.UseCors("policyAnyone");

    app.UseApplicationInsightsRequestTelemetry();

    app.UseApplicationInsightsExceptionTelemetry();

    app.UseMvc();
}
然后,控制器使用通过
User.FindFirst(ClaimTypes.Name).Value
接收的用户名,运行存储过程并返回结果

作为参考,Chrome具有以下请求头:

Accept: application/json, text/plain, `*/*`
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Authorization: Negotiate %lotsOfEncodedText%
Cache-Control: max-age=0
Connection: keep-alive
content-type: text/plain
Host: server:port
Origin: http://localhost:4200
Referer: http://localhost:4200/dashboard
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36
IE有这些:

Request: GET /api/users/username HTTP/1.1
Accept: application/json, text/plain, `*/*`
Content-Type: text/plain
Referer: http://localhost:4200/dashboard
Accept-Language: en-US
Origin: http://localhost:4200
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
Host: server:port
Connection: Keep-Alive
Cache-Control: no-cache

似乎CORS配置正确,我的角度设置非常简单,但IE甚至没有显示凭据框。

IE对待端口的方式与其他浏览器不同。其他浏览器表示,如果端口不同,则它不是相同的“源”。在IE中,如果端口不同但域相同,则它是相同的源,并且不使用头

您可以在此处阅读更多内容:


但是,您仍然应该通过Angular查看返回的数据(因为IE只会将它们视为相同的原点)。那么,您是否从ajax调用中看到了响应数据?

IE对待端口的方式与其他浏览器不同。其他浏览器表示,如果端口不同,则它不是相同的“源”。在IE中,如果端口不同但域相同,则它是相同的源,并且不使用头

您可以在此处阅读更多内容:


但是,您仍然应该通过Angular查看返回的数据(因为IE只会将它们视为相同的原点)。那么,您是否从ajax调用中看到了响应数据?

如果有人遇到这个问题,我想我能够解决这个问题。我的问题是我的电脑的Internet选项,其中登录身份验证选项(Internet选项>安全>自定义级别…>用户身份验证>登录)设置为“仅在Intranet区域自动登录”。虽然这是有意的,IE并没有把我的网站看作是一个内部网站,而是一个互联网网站。原因是IE使用的“点规则”

“如果URI的主机名不包含任何句点(例如),则会将其映射到本地Intranet区域。”[1]

我们本地站点的主机名包含句点,因此映射到Internet区域。在我们能够摆脱繁文缛节之后,手动将我的站点添加到本地Intranet区域(Internet选项>安全>本地Intranet>站点>高级)应该可以解决我的问题

我不知道为什么IE决定回复CORS ACAO的错误信息,但401:未经授权的回复至少足以给我提供线索

[1] 有关Internet选项的信息:


[2] 关于内部网区域确定的信息:

如果有人遇到这个问题,我想我能够解决这个问题。我的问题是我的电脑的Internet选项,其中登录身份验证选项(Internet选项>安全>自定义级别…>用户身份验证>登录)设置为“仅在Intranet区域自动登录”。虽然这是有意的,IE并没有把我的网站看作是一个内部网站,而是一个互联网网站。原因是IE使用的“点规则”

“如果URI的主机名不包含任何句点(例如),则会将其映射到本地Intranet区域。”[1]

我们本地站点的主机名包含句点,因此映射到Internet区域。在我们能够摆脱繁文缛节之后,手动将我的站点添加到本地Intranet区域(Internet选项>安全>本地Intranet>站点>高级)应该可以解决我的问题

我不知道为什么IE决定回复CORS ACAO的错误信息,但401:未经授权的回复至少足以给我提供线索

[1] 有关Internet选项的信息:


[2] 关于内部网区域确定的信息:

是的,我在另一个答案中也看到了这一点,但服务的来源是不同的服务器,因此域应该不同。我也没有看到IE返回的任何数据,所以我认为这不是问题所在。应用程序在401之后完全出错,尽管我根本不依赖调用的结果,也不运行任何函数。是的,我在另一个回答中也看到了这一点,但服务的来源是不同的服务器,因此域应该不同。我也没有看到IE返回的任何数据,所以我认为这不是问题所在。应用程序只是在401之后完全出错,即使我根本不依赖于调用的结果,也没有在调用之后运行任何函数。