Angular MSAL Azure AD Dotnet Core Web API 的 CORS 问题
CORS Issue with Angular MSAL Azure AD Dotnet Core Web API
我一直在学习本教程:
https://github.com/Azure-Samples/ms-identity-javascript-angular-spa-aspnetcore-webapi
身份验证工作正常。
但是,我在控制台中收到 CORS 异常:
跨源请求被阻止:同源策略不允许读取位于 https://localhost:44351/api/todolist/ 的远程资源。 (原因:CORS请求没有成功)。
在startup.cs我改了:
// builder.AllowAnyOrigin()
// .AllowAnyMethod()
// .AllowAnyHeader();
至:
builder.WithOrigins("http://localhost:4200")
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
这没有效果。
谁能帮我解决一下?
这是startup.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddProtectedWebApi(Configuration);
// Creating policies that wraps the authorization requirements
services.AddAuthorization();
services.AddDbContext<TodoContext>(opt => opt.UseInMemoryDatabase("TodoList"));
services.AddControllers();
services.AddCors(o => o.AddPolicy("default", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseCors("default");
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
你试过的方法我都试过了,其他的方法也都试过了,在这个项目中也遇到了同样的问题。可以在官方文档中找到更多详细信息。根据官方文档中的说明,您之前尝试过的跨域解决方案都是可以实现的,我认为问题可能出现在这个示例项目中。如果重新制作demo,就不会有这样的问题。 https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1
最后我给的建议是在传送门设置CORS
,我亲自测试解决了这个问题。
另外,如果需要追根溯源,建议使用抓包的方式进行分析,查看两个网站的请求头,可以参考the document。
解决代码示例的 CORS 问题:
https://github.com/Azure-Samples/ms-identity-javascript-angular-spa-aspnetcore-webapi
我对 Startup.cs 进行了以下更改:
services.AddCors(o => o.AddPolicy("default", builder =>
{
// builder.AllowAnyOrigin()
// .AllowAnyMethod()
// .AllowAnyHeader();
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials()
.WithOrigins("http://localhost:4200");
}));
这为我解决了 CORS 问题。
.Net核心框架6.0
在Program.cs文件中
在应用程序构建调用之前添加以下代码示例var app = builder.Build();
builder.Services.AddCors(options =>
{
options.AddPolicy("angular-app", builder =>
{
builder.WithOrigins("http://localhost:4200");
});
});
通过在 .WithOrigins("http://localhost:4200")
前面加上以下
允许任何方法,headers 和凭据
.AllowAnyMedthod()
.AllowAnyHeader()
.AllowCredentials()
应用程序构建调用后,在检查应用程序环境是否处于开发模式的 if 语句后添加以下行
app.UseCors("angular-app");
我一直在学习本教程:
https://github.com/Azure-Samples/ms-identity-javascript-angular-spa-aspnetcore-webapi
身份验证工作正常。
但是,我在控制台中收到 CORS 异常:
跨源请求被阻止:同源策略不允许读取位于 https://localhost:44351/api/todolist/ 的远程资源。 (原因:CORS请求没有成功)。
在startup.cs我改了:
// builder.AllowAnyOrigin() // .AllowAnyMethod() // .AllowAnyHeader();
至:
builder.WithOrigins("http://localhost:4200") .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials();
这没有效果。
谁能帮我解决一下?
这是startup.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddProtectedWebApi(Configuration);
// Creating policies that wraps the authorization requirements
services.AddAuthorization();
services.AddDbContext<TodoContext>(opt => opt.UseInMemoryDatabase("TodoList"));
services.AddControllers();
services.AddCors(o => o.AddPolicy("default", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseCors("default");
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
你试过的方法我都试过了,其他的方法也都试过了,在这个项目中也遇到了同样的问题。可以在官方文档中找到更多详细信息。根据官方文档中的说明,您之前尝试过的跨域解决方案都是可以实现的,我认为问题可能出现在这个示例项目中。如果重新制作demo,就不会有这样的问题。 https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1
最后我给的建议是在传送门设置CORS
,我亲自测试解决了这个问题。
另外,如果需要追根溯源,建议使用抓包的方式进行分析,查看两个网站的请求头,可以参考the document。
解决代码示例的 CORS 问题:
https://github.com/Azure-Samples/ms-identity-javascript-angular-spa-aspnetcore-webapi
我对 Startup.cs 进行了以下更改:
services.AddCors(o => o.AddPolicy("default", builder =>
{
// builder.AllowAnyOrigin()
// .AllowAnyMethod()
// .AllowAnyHeader();
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials()
.WithOrigins("http://localhost:4200");
}));
这为我解决了 CORS 问题。
.Net核心框架6.0
在Program.cs文件中
在应用程序构建调用之前添加以下代码示例var app = builder.Build();
builder.Services.AddCors(options =>
{
options.AddPolicy("angular-app", builder =>
{
builder.WithOrigins("http://localhost:4200");
});
});
通过在 .WithOrigins("http://localhost:4200")
前面加上以下
.AllowAnyMedthod()
.AllowAnyHeader()
.AllowCredentials()
应用程序构建调用后,在检查应用程序环境是否处于开发模式的 if 语句后添加以下行
app.UseCors("angular-app");