在 Angular 9 + Asp.net Core Web API 中启用 Windows 身份验证后,预检(选项)请求失败

Posted

技术标签:

【中文标题】在 Angular 9 + Asp.net Core Web API 中启用 Windows 身份验证后,预检(选项)请求失败【英文标题】:Preflight (Option) request is failing after enabling Windows Authentication in Angular 9 + Asp.net Core Web API 【发布时间】:2020-09-02 14:31:34 【问题描述】:

我们有 asp.net core web api 和 angular 9 应用程序。 Asp.net 核心 Web API 使用以下代码启用了 Windows 身份验证。另外,为了测试,我为所有人启用了 CORS。

"iisSettings": 
    "windowsAuthentication": true,
    "anonymousAuthentication": false,
    "iisExpress": 
      "applicationUrl": "http://localhost:44305",
      "sslPort": 0
    
  ,


    services.AddCors(options =>
    
        options.AddPolicy("CustomCorsPolicy",
            builder => builder.WithOrigins("http://localhost:4200")
            .AllowAnyMethod()
            .AllowAnyHeader()
            .AllowCredentials());
    );


app.UseCors("CustomCorsPolicy");

当我发出 GET 请求时,我得到了响应,但发出 POST 请求时却失败了。我已经将 withCrendtial 设置为 true。下面是我设置的拦截器

  intercept(httpreq: HttpRequest<any>, next: HttpHandler):
    Observable<HttpEvent<any>> 
      httpreq= httpreq.clone(
        withCredentials: true
      );
      return next.handle(httpreq);
  

另外,像这样在应用模块上注册拦截器

 
  provide: HTTP_INTERCEPTORS, 
  useClass: WdAuthHttpInterceptor, 
  multi: true 
,

从源“http://localhost:4200”访问“https://localhost:44305/anotherdata/test”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。

【问题讨论】:

您提供的代码看起来不错。您是否在提供程序的模块中连接了拦截器,例如在 app.module.ts 中。类似 import HttpClientModule, HTTP_INTERCEPTORS from '@angular/common/http';和提供者: [ // Http Interceptor(s) - 添加客户端凭据 [ 提供:HTTP_INTERCEPTORS, useClass: HttpRequestInterceptor, multi: true ], ], 是的,我已经在app模块上注册了。 一个想法。如果很明显,请道歉 - 您的拦截器在 localhost:4200 或 localhost:8000 中。它需要在localhost:4200 中,不过我相信你已经这样做了。 locahost:8000 是 API,localhost:4200 是 Angular 应用程序。我在本地主机上有拦截器:4200 【参考方案1】:

我正在使用 .NET Core 3.1,这就是我的“API”项目的外观。这就是让 CORS 运行 Startup.cs 所需的全部内容。 **需要重新启动 IIS express 服务器以获取更改。

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        
            if (env.IsDevelopment())
            
                app.UseDeveloperExceptionPage();
            

            app.UseRouting();

            app.UseCors(builder =>
                builder.WithOrigins("http://localhost:21460").AllowCredentials());

            app.UseAuthentication();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>  endpoints.MapControllers(); );
        


【讨论】:

以上是关于在 Angular 9 + Asp.net Core Web API 中启用 Windows 身份验证后,预检(选项)请求失败的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 中的 Jwt 令牌身份验证

如何将 Angular 9 SPA 项目和 ASP.NET Core 2.2 MVC 项目组合成一个 Visual Studio 2017 解决方案?

使用ASP.NET Web API和Web API Client Gen使Angular 2应用程序的开发更加高效

CORS Angular 10 ASP.Net

ASP.NET Core和Angular 2双剑合璧

ASP.Net Core、Angular2 和基于令牌的身份验证