Angular / .NET Core 项目上的 Cors 问题
Posted
技术标签:
【中文标题】Angular / .NET Core 项目上的 Cors 问题【英文标题】:Cors issue on an Angular / .NET Core project 【发布时间】:2020-11-24 15:26:50 【问题描述】:我无法从我的 http 请求中获取数据。在服务器端,我有以下内容
public void ConfigureServices(IServiceCollection services)
services.AddControllers();
services.AddSwaggerGen();
services.AddScoped<IRepository, Repository>();
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddCors(options =>
options.AddDefaultPolicy(builder => builder
.WithOrigins("http://localhost:4200")
.AllowAnyMethod().AllowAnyHeader().AllowCredentials()));
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c =>
c.SwaggerEndpoint("/swagger/v1/swagger.json", "KYCDB API");
);
app.UseHttpsRedirection();
app.UseRouting();
app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
endpoints.MapControllers();
);
该项目还开启了 Windows 身份验证,关闭了匿名。
"iisSettings":
"windowsAuthentication": true,
"anonymousAuthentication": false,
"iisExpress":
"applicationUrl": "http://localhost:51721",
"sslPort": 49321
在角度方面我得到了一个组件
export class HeaderComponent implements OnInit
currentEmployee$: Observable<Employee>;
constructor(private userService: UserService)
ngOnInit(): void
this.currentEmployee$ = this.userService.getCurrentEmployee();
还有一个拦截器
@Injectable()
export class ApiInterceptor implements HttpInterceptor
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>
req = req.clone( withCredentials: true );
return next.handle(req);
当页面加载时,我收到 2 个警告和一个错误
警告:跨域请求被阻止:同源策略不允许读取位于 http://localhost:51721/employee/current 的远程资源。 (原因:CORS 标头“Access-Control-Allow-Origin”缺失)。
警告:跨域请求被阻止:同源策略不允许读取位于 http://localhost:51721/employee/current 的远程资源。 (原因:CORS 请求未成功)。
错误:http://localhost:51721/employee/current 的 Http 失败响应:0 未知错误
我需要纠正什么?
【问题讨论】:
如果我注释掉 app.UseHttpsRedirection(); 一切都会顺利进行 我发现您的网址有些不匹配。您使用.WithOrigins("http://localhost:4200")
定义 CORS,使用 http://localhost:51721
启动,并可能重定向到另一个启用 HTTPS 的 URL。尝试在WithOrigins
调用中设置所有有效来源。
WithOrigins 不是我放置所有客户端 url 的地方吗?这就是为什么我把 Angular 放在那里。我也在 environment.ts 文件中的 Angular 项目中使用的启动 url。
是的,如果您的客户端 Angular 应用程序托管在 http://localhost:4200
上,那么它是正确的。起初我以为你也从 ASP.NET 应用程序为客户端提供服务。
如果我删除 https 重定向,我无法理解为什么一切正常。招摇也不能在 https 上工作。
【参考方案1】:
抱歉,这是一个困难的问题,因此可能有很多原因它不起作用,但我遇到了类似的问题,并通过更改 Configure() 函数中的 cors 调用解决了它。 Configure() 函数在运行时被调用并充当 http 请求管道,因此在某些情况下执行顺序很重要 (https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-3.1#the-configure-method)
您可以尝试以下方法:
改变电流:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c =>
c.SwaggerEndpoint("/swagger/v1/swagger.json", "KYCDB API");
);
app.UseHttpsRedirection();
app.UseRouting();
app.UseCors(); // Move this
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
endpoints.MapControllers();
);
收件人:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c =>
c.SwaggerEndpoint("/swagger/v1/swagger.json", "KYCDB API");
);
app.UseRouting();
app.UseCors(); // Here
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
endpoints.MapControllers();
);
因此,http 管道中的第一个操作是验证 cors。我认为这是一个公平的赌注,因为从您的问题来看,听起来您没有收到应用程序初始化错误,而是出现运行时客户端请求时间错误。我不确定这是否会解决问题,但也许会有所帮助!
【讨论】:
感谢您的建议。我试过了。我尝试了每一个fu.....订单!微软实际上说首先放置重定向,然后是路由,然后是 cors。我开始相信这个问题与企业环境有关。我会尝试在家里复制这个 2nite。以上是关于Angular / .NET Core 项目上的 Cors 问题的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2017 .NET Core 2.1 Angular 上的“npm run build -- --prod”错误
.NET Core 3.1 + Angular 上的 PreflightMissingAllowOriginHeader CORS 错误
用VSCode开发一个asp.net core2.0+angular5项目: Angular5+asp.net core 2.0 web api文件上传
更改 Angular 和 ASP.NET Core 项目中的默认身份路由
将 Angular 和 .net core web api 安全地集成到现有的 MVC 5 应用程序中
ASP.NET Core Web API + Angular 仿B站 目的分析以及创建 WebAPI + Angular7 项目