如何将 CORS 标头添加到 401/403 响应中?

And*_*ark 2 authorization cors asp.net-core-webapi angular

我已经构建了一个 spa 网站,前端使用 Angular,服务器端使用 asp.net Core Web Api 3.0。

我正在尝试配置 Windows 身份验证,感谢这篇文章到目前为止一切顺利!但是...当 Api 正确返回 401/403 时,CORS 标头会出现问题,cors 标头会丢失。这是一个例子:

General:
Status Code: 403 Forbidden
Remote Address: [::1]:44389
Referrer Policy: no-referrer-when-downgrade
Response-Headers:
Date: Wed, 20 Nov 2019 16:33:57 GMT
Persistent-Auth: true
Server: Microsoft-IIS/10.0
Transfer-Encoding: chunked
X-Powered-By: ASP.NET
Run Code Online (Sandbox Code Playgroud)

这是我使用该属性时生成的[Authorise]。我遇到的问题是,当 CORS 标头丢失时,角度内的状态代码为 0,因此我的 http 拦截器不知道未经授权,并且无​​法正确处理重定向。

我尝试使用中间件手动添加标头StartUp

app.Use(async (context, next) =>
{
    context.Response.OnStarting(() =>
    {
        context.Response.Headers.Add("Access-Control-Allow-Origin", "http://localhost:4200");

        return Task.FromResult(0);
    });

    await next();
});
Run Code Online (Sandbox Code Playgroud)

但这不起作用,中间件仍然删除标头。

有趣的是,如果我删除授权属性并在控制器方法中返回 401/403:

[HttpGet]
public IActionResult Get()
    => Unauthorized();
Run Code Online (Sandbox Code Playgroud)

CORS 标头返回如下:

Response-Headers:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:4200  
Run Code Online (Sandbox Code Playgroud)

这是不可行的!

有谁知道如何确保授权中间件保留 CORS 标头?

And*_*ark 5

事实证明一切都配置正确,几乎!

问题只是中间件在StartUp类中配置的顺序。我不知道中间件的配置顺序对执行有影响。这是我原来的代码:

app.UseRouting();

app.UseAuthentication()
   .UseAuthorization();

app.UseCors(builder => builder.WithOrigins("http://localhost:4200")
                                      .AllowCredentials()
                                      .AllowAnyMethod()
                                      .AllowAnyHeader());

app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
Run Code Online (Sandbox Code Playgroud)

在身份验证之前配置 Cors解决了问题,现在中间件处理的未经授权的请求仍然包含 cors 标头。

app.UseRouting();

app.UseCors(builder => builder.WithOrigins("http://localhost:4200")
                                      .AllowCredentials()
                                      .AllowAnyMethod()
                                      .AllowAnyHeader());
app.UseAuthentication()
   .UseAuthorization();

app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
Run Code Online (Sandbox Code Playgroud)