.NET Core 3.1 + Angular 上的 PreflightMissingAllowOriginHeader CORS 错误
PreflightMissingAllowOriginHeader CORS error on .NET Core 3.1 + Angular
我正在 .NET Core 3.1 + Angular 上开发一个应用程序,直到最近我尝试对后端实施协商身份验证配置时一切正常。无论如何,即使在恢复所有身份验证配置后问题仍然存在,因此它可能不相关。
我收到描述 PreflightMissingAllowOriginHeader 后跟 401 错误的 CORS 错误。
下面你可以看到我的代码。出于沮丧,当我尝试调试此问题时,我什至允许所有来源,headers 和方法。
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy(name: MyAllowSpecificOrigins,
builder => { builder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod().AllowCredentials(); });
});
// Tried both ^ and v
/* services.AddCors(options =>
{
options.AddPolicy(name: MyAllowSpecificOrigins,
builder => { builder.WithOrigins("http://localhost:4200").AllowAnyHeader().AllowAnyMethod().AllowCredentials(); });
});*/
.
.
.
.
services.AddAuthentication(NegotiateDefaults.AuthenticationScheme).AddNegotiate();
.
.
.
.
.
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
/* app.UseHttpsRedirection();*/
app.UseRouting();
app.UseCors(MyAllowSpecificOrigins);
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers().RequireCors(MyAllowSpecificOrigins); // <--- Tried both with and without RequireCors
});
}
Angular WebReqService
readonly ROOT_URL: string;
readonly httpHeaders: HttpHeaders = new HttpHeaders({'Content-Type': 'application/json'});
readonly httpOptions = {
headers: this.httpHeaders,
withCredentials: true
};
constructor(private http: HttpClient) {
this.ROOT_URL = 'http://localhost:5000';
}
get(uri: string): Observable<any> {
return this.http.get<any[]>(`${this.ROOT_URL}/${uri}`, this.httpOptions);
}
最奇怪的是,如果我尝试通过在浏览器中调用请求或在具有 NTLM 授权的 Insomnia 中直接访问 API,一切正常。只有当我尝试从 Angular FE 访问 API 时,我才会收到错误。
任何想法可能是什么原因以及如何解决它?
另外,我认为这不是由于未被授权使用该应用程序引起的,因为正如我所说,它在 Angular 之外工作,而且如果用户未被授权,它被配置为 return 403 而不是 401 .
您可以尝试设置 Angular 代理。
1 - 在 angular 应用程序的根目录下创建一个文件 proxy.conf.js,内容如下:
const PROXY_CONFIG = [
{
context: ["/api"],
target: "http://localhost:5000",
secure: false,
logLevel: "error",
changeOrigin: true,
}
];
module.exports = PROXY_CONFIG;
2 - 在 angular.json 项目 -> yourprojectname -> architect -> serve ->configurations -> development 中,添加“proxyConfig”:“proxy.conf.js”
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"configurations": {
"production": {
"browserTarget": "client:build:production"
},
"development": {
"browserTarget": "client:build:development",
"proxyConfig": "proxy.conf.js"
}
},
3 - 在您的 Angular WebReqService 中,设置 this.ROOT_URL = 'http://localhost:4200';
在 .NET Core 3.1/angular.
中,不必为在本地主机上的开发设置常规 CORS
我最好的选择是您的 launchSettings.json.csproj 文件有问题,或者您忘记在 startup.cs
的 Configure 方法中设置 useSpa
app.UseSpa(spa =>
{
// To learn more about options for serving an Angular SPA from ASP.NET Core,
// see https://go.microsoft.com/fwlink/?linkid=864501
spa.Options.SourcePath = "pathToMyAngularRootFolder";
if (env.IsDevelopment())
{
spa.UseProxyToSpaDevelopmentServer("http://localhost:4200");
}
});
我正在 .NET Core 3.1 + Angular 上开发一个应用程序,直到最近我尝试对后端实施协商身份验证配置时一切正常。无论如何,即使在恢复所有身份验证配置后问题仍然存在,因此它可能不相关。
我收到描述 PreflightMissingAllowOriginHeader 后跟 401 错误的 CORS 错误。
下面你可以看到我的代码。出于沮丧,当我尝试调试此问题时,我什至允许所有来源,headers 和方法。
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy(name: MyAllowSpecificOrigins,
builder => { builder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod().AllowCredentials(); });
});
// Tried both ^ and v
/* services.AddCors(options =>
{
options.AddPolicy(name: MyAllowSpecificOrigins,
builder => { builder.WithOrigins("http://localhost:4200").AllowAnyHeader().AllowAnyMethod().AllowCredentials(); });
});*/
.
.
.
.
services.AddAuthentication(NegotiateDefaults.AuthenticationScheme).AddNegotiate();
.
.
.
.
.
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
/* app.UseHttpsRedirection();*/
app.UseRouting();
app.UseCors(MyAllowSpecificOrigins);
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers().RequireCors(MyAllowSpecificOrigins); // <--- Tried both with and without RequireCors
});
}
Angular WebReqService
readonly ROOT_URL: string;
readonly httpHeaders: HttpHeaders = new HttpHeaders({'Content-Type': 'application/json'});
readonly httpOptions = {
headers: this.httpHeaders,
withCredentials: true
};
constructor(private http: HttpClient) {
this.ROOT_URL = 'http://localhost:5000';
}
get(uri: string): Observable<any> {
return this.http.get<any[]>(`${this.ROOT_URL}/${uri}`, this.httpOptions);
}
最奇怪的是,如果我尝试通过在浏览器中调用请求或在具有 NTLM 授权的 Insomnia 中直接访问 API,一切正常。只有当我尝试从 Angular FE 访问 API 时,我才会收到错误。
任何想法可能是什么原因以及如何解决它? 另外,我认为这不是由于未被授权使用该应用程序引起的,因为正如我所说,它在 Angular 之外工作,而且如果用户未被授权,它被配置为 return 403 而不是 401 .
您可以尝试设置 Angular 代理。
1 - 在 angular 应用程序的根目录下创建一个文件 proxy.conf.js,内容如下:
const PROXY_CONFIG = [
{
context: ["/api"],
target: "http://localhost:5000",
secure: false,
logLevel: "error",
changeOrigin: true,
}
];
module.exports = PROXY_CONFIG;
2 - 在 angular.json 项目 -> yourprojectname -> architect -> serve ->configurations -> development 中,添加“proxyConfig”:“proxy.conf.js”
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"configurations": {
"production": {
"browserTarget": "client:build:production"
},
"development": {
"browserTarget": "client:build:development",
"proxyConfig": "proxy.conf.js"
}
},
3 - 在您的 Angular WebReqService 中,设置 this.ROOT_URL = 'http://localhost:4200';
在 .NET Core 3.1/angular.
中,不必为在本地主机上的开发设置常规 CORS我最好的选择是您的 launchSettings.json.csproj 文件有问题,或者您忘记在 startup.cs
的 Configure 方法中设置 useSpa app.UseSpa(spa =>
{
// To learn more about options for serving an Angular SPA from ASP.NET Core,
// see https://go.microsoft.com/fwlink/?linkid=864501
spa.Options.SourcePath = "pathToMyAngularRootFolder";
if (env.IsDevelopment())
{
spa.UseProxyToSpaDevelopmentServer("http://localhost:4200");
}
});