angular2:当Windows身份验证打开时,asp.net核心服务抛出“无访问控制允许来源”

时间:2016-09-21 07:16:10

标签: asp.net-web-api angular

我有任何访问angular2服务的asp.net core webapi个应用。如果webapi iis配置是(Properties \ launchSettings.json):

,它可以正常工作
"iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:12246/",
      "sslPort": 0
    }
  },

但是,一旦WindowsAuthenticationtrue且AnonymousAuthentication为false,它就会抛出错误。错误:

  

XMLHttpRequest无法加载   http://localhost:12246/api//values/getSettings。没有   请求中存在“Access-Control-Allow-Origin”标头   资源。因此不允许来源“http://localhost:4200”   访问。响应的HTTP状态代码为401。

请问好吗?

1 个答案:

答案 0 :(得分:1)

您正在尝试制作跨源请求。这在CORS规范下是允许的,但需要配置。

解决此问题有三个步骤。

  1. 将两台Web服务器配置为使用Windows身份验证(并禁用匿名身份验证)。也就是说,必须配置托管Angular 2应用程序的服务器托管ASP.NET Core WebAPI应用程序的服务器。

  2. 为您的ASP.NET核心WebAPI应用启用CORS:

    在您的Startup.cs文件中:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        if (env.IsDevelopment())
        {
            app.UseCors(builder =>
            builder
            .WithOrigins("http://localhost:4200")  //<-- OP's origin
            .AllowAnyHeader()
            .AllowAnyMethod()
            .AllowCredentials()
            );
        }
    
        app.UseMvc();
    }
    
  3. 让Angular 2发送您的凭据及其CORS请求:

    import {Injectable}         from '@angular/core'
    import {Headers, Http, Response} from '@angular/http';
    import {Observable}         from 'rxjs/Observable';
    
    import 'rxjs/add/operator/toPromise';
    
    @Injectable()
    export class SomeAngularServiceThatCallsYourAPI{
    
        constructor(private http: Http) { }
    
        getApiData(): Promise<MyDataResult[]> {
    
            var apiUrl = 'http://localhost:12246/api//values/getSettings';
            return this.http.get(apiUrl,{
                withCredentials: true
            })
                .toPromise()
                .then(response => this.extractData(response) as MyDataResult[])
                .catch(this.handleError);
        }
    
    }
    
  4. 有关详细信息,请参阅我的blog post