原因是ASP.NET Core 6中更改了跨站点请求伪造(XSRF/CSRF)中间件的默认行为。需要手动在Angular应用程序中设置XSRF令牌,并在ASP.NET Core Web API中验证该令牌。
在Angular应用程序中,可以使用HttpClientXsrfModule提供的withOptions方法手动设置XSRF令牌。在app.module.ts中的imports中添加HttpClientXsrfModule,并设置withOptions方法,代码示例如下:
import { NgModule } from '@angular/core';
import { HttpClientModule, HttpClientXsrfModule } from '@angular/common/http';
@NgModule({
imports: [
HttpClientModule,
HttpClientXsrfModule.withOptions({
cookieName: 'XSRF-TOKEN',
headerName: 'X-XSRF-TOKEN'
})
],
...
})
export class AppModule { }
此代码中假定XSRF令牌保存在名为XSRF-TOKEN
的cookie中,并且在向WebAPI发送请求时使用名为X-XSRF-TOKEN
的HTTP头。
在ASP.NET Core Web API中,可以通过在Startup.Configure中添加CSRF中间件和调用UseMiddleware扩展方法来验证XSRF令牌。代码示例如下:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseHttpsRedirection();
app.UseRouting();
app.UseCors(builder =>
builder.AllowAnyHeader()
.AllowAnyMethod()
.AllowAnyOrigin());
app.UseAuthentication();
app.UseAuthorization();
app.Use(async (context, next) =>
{
if (context.Request.Path.StartsWithSegments("/api"))
{
string xsrfToken = context.Request.Cookies["XSRF-TOKEN"];
string xsrfHeader = context.Request.Headers["X-XSRF-TOKEN"];
if (xsrfToken == null || xsrfHeader != xsrfToken)
{
context.Response.StatusCode = 403;
return;
}
}
await next();
});
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
此代码中假定XSRF令牌保存在名为XSRF-TOKEN
的cookie中,并且在向WebAPI发送请求时使用名为X-XSRF-TOKEN
的HTTP头。如果XSRF令牌无效,则请求将在中间件中终止,并返回HTTP 403响应码。
需要注意的是,以上示例中的代码仅供参考,实际情况可能因应用程序的具体需求而有所不同。