.NET Core 2 WebAPI CORS 与 Angular 4 前端和 Windows Auth 的问题

Posted

技术标签:

【中文标题】.NET Core 2 WebAPI CORS 与 Angular 4 前端和 Windows Auth 的问题【英文标题】:.NET Core 2 WebAPI CORS problems with Angular 4 front end and Windows Auth 【发布时间】:2019-02-02 03:08:50 【问题描述】:

是的,我有无数文章并重新安排了添加 app.UserCors 和其他建议,但仍然卡住了。

将 Visual Studio WebAPI Core 2 与 Angular 2 Web 前端结合使用。

在使用 IIS 8.5 的远程服务器上使用 Windows 身份验证(实际上这在本地也不起作用)。

WebAPI 启动配置:

public void ConfigureServices(IServiceCollection services)

    services.AddDbContext<SomeContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SomeDB")));

    //////// ********************
    //////// Setup CORS
    //////// ********************
    var corsBuilder = new CorsPolicyBuilder();
    corsBuilder.AllowAnyHeader();
    corsBuilder.AllowAnyMethod();
    corsBuilder.WithOrigins("*"); 
    corsBuilder.AllowCredentials();

    services.AddCors(options =>
    
        options.AddPolicy("AllowAll", corsBuilder.Build());
    );

    services.AddMvc();

...


public void Configure(IApplicationBuilder app, IHostingEnvironment env)

    app.UseCors("AllowAll"); //<===            

    app.UseMvc();

...

当我在本地运行 WebAPI 或将其部署到远程服务器时,我的 Angular 4 前端会给我:

对于 WebAPI 控制器的调用 - 401(未经授权)(即使在没有设置 [Authorize()] 的控制器上也是如此。

当我尝试使用 Angular 应用程序的本地实例访问远程 WebAPI 时:

请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://localhost:62482' 不允许访问。响应的 HTTP 状态代码为 401。

我尝试重新安排启动时添加服务的顺序。

我在 IIS8.5 中手动添加了响应标头(每当我部署新代码时它们都会被覆盖)。

我已经从 WebAPI 应用程序中完全删除了所有 CORS 内容。

发誓这一切都是一次性的。不知道发生了什么变化。

当我将 WebAPI Core 2 应用程序和 Angular Web 应用程序部署到远程服务器时,我都运行良好,因为来源相同,但这使得本地调试成为不可能。

*** 每个请求的 Angular REPO 代码:

import  Injectable, Inject  from '@angular/core';
import  Http  from '@angular/http';
import  Observable  from 'rxjs/Observable';
import  DocumentModel  from '../models/document.model';
import 'rxjs/add/observable/from';
import 'rxjs/add/operator/map';
import  map  from 'rxjs/operators/map';
import  IRepository  from './IRepository';
declare var API_URL: string;

@Injectable()
export class DocumentRepository implements IRepository<DocumentModel, number> 
    GetByDocument(key: any): Observable<DocumentModel[]> 
        throw new Error("Method not implemented.");
    
    private httpService: Http;
    private apiRootUrl: string;

    constructor(http: Http) 
        this.httpService = http;
        this.apiRootUrl = API_URL;
    

    Create(Model: DocumentModel): Observable<any> 
        throw new Error("Method not implemented.");
    

    Find(key: any): Observable<DocumentModel[]> 
        return this.httpService.get(this.apiRootUrl +'documents/mine').map(result => result.json());
    

    Get(id: any): Observable<DocumentModel> 
        return this.httpService.get(this.apiRootUrl +'documents/' + id).map(result => result.json());
    

【问题讨论】:

您的 .net 核心 API 是否总是在同一个端口上提供服务,即 ..62482 也可以尝试在您的配置函数中添加它app.UseCors(builder =&gt; builder.WithOrigins("http://localhost") .AllowAnyHeader() ); 并发布您的角度设置... @user3637002 请同时显示进行 API 调用的 Angular 2 代码(包括 CORS 标头/设置)。 WithOrigins("*") 更改为AllowAnyOrigin。并尝试手动将其添加到您的控制器以使用属性 [EnableCors("AllowAll")] 对其进行测试 >>将 WithOrigins("*") 更改为 AllowAnyOrigin。并尝试手动将其添加到您的控制器以使用属性 [EnableCors("AllowAll")]>> 尝试所有这些...没有骰子。 【参考方案1】:

这对我有用: 在 Startup.cs 中

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    

        if (env.IsDevelopment())
        
            app.UseDeveloperExceptionPage();
        
        app.UseAuthentication();

        //app.UseHttpsRedirection();
        app.UseCors(
            options => options.AllowAnyOrigin().AllowAnyHeader()
                                               .AllowAnyMethod()
                                               .AllowCredentials()
        );
        app.UseMvc();
    

仅此而已,Cors 没有其他提及。

我使用 JWT Bearer Token 并且 [Authorize] 按预期工作。

您可以先尝试使用 Postman,看看您的端点是否正常工作,然后开始制作 Angular http.get()

这是角部分

const headers = new HttpHeaders().
                    set('Accept', 'application/json')

const url = 'http://localhost:5000/api/'  

return this.http.get(
   url + 'endpoint',
    headers: headers 
);  

【讨论】:

我的 Angular 应用程序中是否需要任何身份验证?该 API 使用 Windows 身份验证,并且在服务器上似乎可以正常工作以检测用户身份。只有在本地运行并尝试访问远程服务器时,我才会遇到这些问题。 FYI SWAGGER always 在我使用它来测试 API 时有效。这似乎是一个有角度的网络应用程序问题。

以上是关于.NET Core 2 WebAPI CORS 与 Angular 4 前端和 Windows Auth 的问题的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.Net Core 5 WebAPI 中启用 CORS

.NET Core 2 Web API:CORS 问题

Asp.Net Core WebAPI CORS 不工作

如何在 Asp.Net Core 3.0 WebAPI 中启用 CORS

Blazor 无法连接到 ASP.NET Core WebApi (CORS)

在 ASP .NET Core 2.1 Web Api 中启用 CORS