Angular 2 AspNetCore WebApi CORS 问题:预检响应具有无效的 HTTP 状态代码 401
Angular 2 AspNetCore WebApi CORS issue: Response for preflight has invalid HTTP status code 401
我正在尝试在 Angular 2 RC6 应用程序中针对我在 Visual Studio 2015 年实施的 AspNetCore WebApi 项目实施简单的基于令牌的身份验证。
我已将示例应用程序放在 github 上:https://github.com/tonywr71/Snazzle,这是一个功能齐全的应用程序。
在应用程序中,我点击登录菜单项,输入登录名和密码信息,然后点击登录。
它成功returns 是身份验证令牌,我将其存储在隔离存储中。
然后我单击 Fetch Data 菜单项,它会调用一个具有 Authorize 属性的 Sample Controller。它传递从隔离存储中检索并添加到 header 的令牌。但它因错误而失败。
我收到的错误是 "XMLHttpRequest cannot load http://localhost:5100/api/SampleData/WeatherForecasts. Response for preflight has invalid HTTP status code 401"
WeatherForecasts 是一种 WebApi 方法,returns 一些 json 被 Angular 2 客户端组件使用。
401 未经授权,它获得未经授权的原因是飞行前的 ORIGIN 调用,因为 header 没有为 ORIGIN 调用发送。
当我使用 Postman 运行 时,添加令牌后就没有问题 - 方法调用有效。那是因为Postman不需要担心CORS。
所以我的问题是,如何让 AspNetCore 不检查 ORIGIN 调用以进行身份验证?或者,如果这不是正确的方法,我应该如何实现这一目标?我应该添加一些中间件吗?
您必须在 Web api 端启用 CORS。
要在 Web api 端启用 CORS,您必须执行这些步骤-
首先在project.json-"Microsoft.AspNetCore.Cors": "1.0.0",
添加依赖
然后像这样在 startup.cs 中启用 CORS-
app.UseCors(builder => {
builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
});
如果你想限制特定来源,那么你可以这样做-
app.UseCors(builder => builder.WithOrigins("example.com"));
您可以找到有关 CORS 的更多信息here
看看这是否有帮助。
这对我有帮助:
转到Startup.cs文件
在您的 ConfigureServices(IServiceCollection services)
函数中添加以下内容
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
这在您的 Configure(IApplicationBuilder app)
函数中:
app.UseCors("CorsPolicy");
我正在尝试在 Angular 2 RC6 应用程序中针对我在 Visual Studio 2015 年实施的 AspNetCore WebApi 项目实施简单的基于令牌的身份验证。
我已将示例应用程序放在 github 上:https://github.com/tonywr71/Snazzle,这是一个功能齐全的应用程序。
在应用程序中,我点击登录菜单项,输入登录名和密码信息,然后点击登录。
它成功returns 是身份验证令牌,我将其存储在隔离存储中。
然后我单击 Fetch Data 菜单项,它会调用一个具有 Authorize 属性的 Sample Controller。它传递从隔离存储中检索并添加到 header 的令牌。但它因错误而失败。
我收到的错误是 "XMLHttpRequest cannot load http://localhost:5100/api/SampleData/WeatherForecasts. Response for preflight has invalid HTTP status code 401"
WeatherForecasts 是一种 WebApi 方法,returns 一些 json 被 Angular 2 客户端组件使用。
401 未经授权,它获得未经授权的原因是飞行前的 ORIGIN 调用,因为 header 没有为 ORIGIN 调用发送。
当我使用 Postman 运行 时,添加令牌后就没有问题 - 方法调用有效。那是因为Postman不需要担心CORS。
所以我的问题是,如何让 AspNetCore 不检查 ORIGIN 调用以进行身份验证?或者,如果这不是正确的方法,我应该如何实现这一目标?我应该添加一些中间件吗?
您必须在 Web api 端启用 CORS。
要在 Web api 端启用 CORS,您必须执行这些步骤-
首先在project.json-"Microsoft.AspNetCore.Cors": "1.0.0",
然后像这样在 startup.cs 中启用 CORS-
app.UseCors(builder => {
builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
});
如果你想限制特定来源,那么你可以这样做-
app.UseCors(builder => builder.WithOrigins("example.com"));
您可以找到有关 CORS 的更多信息here
看看这是否有帮助。
这对我有帮助:
转到Startup.cs文件
在您的 ConfigureServices(IServiceCollection services)
函数中添加以下内容
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
这在您的 Configure(IApplicationBuilder app)
函数中:
app.UseCors("CorsPolicy");