C# 为什么有棱角';s请求标头修改引发选项401错误

C# 为什么有棱角';s请求标头修改引发选项401错误,c#,angular,.net-core,C#,Angular,.net Core,我想修改angularHttpRequest的标题,但是chrome中抛出了一个选项401错误 我使用运行在上的Angular 7客户端和运行在上的.net core 2.1 我面临的问题是: 如果我不使用httpInterceptor(这意味着我不修改httpRequest头),请求将继续发送到服务器并返回值 但如果我试图修改标题,则会出现以下错误: 选项401(未经授权) 加载失败: 对飞行前请求的响应未通过访问控制检查: 请求的资源上存在“无访问控制允许来源”标头。 因此不允许源“”访问。

我想修改angular
HttpRequest
的标题,但是chrome中抛出了一个选项401错误

我使用运行在上的Angular 7客户端和运行在上的.net core 2.1

我面临的问题是:

如果我不使用
httpInterceptor
(这意味着我不修改
httpRequest
头),请求将继续发送到服务器并返回值

但如果我试图修改标题,则会出现以下错误:

选项401(未经授权)
加载失败:
对飞行前请求的响应未通过访问控制检查:
请求的资源上存在“无访问控制允许来源”标头。
因此不允许源“”访问。
响应的Http状态代码为401

这有点奇怪,因为如果我克隆Chrome创建的
httpRequest
,当我不修改头时,请求就会成功。但当我试图修改它时,它失败了

此外,我还尝试在请求中添加“Access Control Allow Origin”头。但我再次收到同样的错误

我使用
HttpInterceptor
修改
HttpRequest
标题

export class HeaderInterpreter  implements HttpIntterceptor {

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    If (req instanceof HttpRequest && localStorage.getItem("token")){
        const modReq = req.clone({
            headers: req.headers.set('Authorization', `Bearer ${localStorage.getItem("token")}`)
        })
        return next.handle(modReq);
    }
    return next.handle(req);
}

我还在Angular的
http上使用了
withCredentials:true
。get
函数和服务器上的windows身份验证出现问题的原因有几个:

首先,我使用windows身份验证和jwt令牌,因此我在program.cs上使用“UseHttpSys”启用了windows身份验证

其次,因为我同时使用了windows身份验证和jwt令牌,所以我无法在authorize头上发送jwt令牌,而是在我自己的自定义头上发送

第三,因为我发送了一个带有authorize头的请求,Chrome为了Cors的目的发送了一个飞行前请求。但是,由于飞行前请求(也称为选项)未与authorize标头一起发送,服务器拒绝了它(因为它只向经过身份验证的用户授予权限)。所以我需要在服务器上启用匿名访问

第四,我使用了一个中间件来检查请求是否是飞行前的,如果不是,我检查reuest是否来自经过身份验证的用户。(因为我允许匿名访问,chrome首先发送一个未经验证的请求,当它被中间件拒绝时,chrome重新发送一个经过验证的请求)


请参阅参考

浏览器本身拒绝调用.NET核心应用程序。您需要在Angular服务器上配置CORS。您的客户端是从端口4200上的Angular服务器加载的,并具有它提供的CORS头。该服务器需要指定是否可以调用
localhost:5000
too@PanagiotisKanavos-angular dev服务器是配置cors的错误位置。客户端部分在这里应该是正常的。SHMT-是否使用身份验证?我猜你的mvc应用程序中有什么东西阻止了选项调用。我确实使用windows身份验证。前几天我在谷歌上搜索了这个问题,我相信我找到了问题,但没有找到解决方案。因为我添加了一个authorize标头,所以chrome会发送一个飞行前选项请求(在没有windows身份验证标头的情况下发送),而服务器只允许经过身份验证的用户。我在旧的asp.net中看到了一些解决方法,但在.net核心中找不到任何解决方案
public void ConfigureServices(IserviCollection services)
{
...
services.addCors();
...
services.addMvc();
}

public void Configure(IApplicationBuilder app)
{
   ...

   app.UseCors(builder => 
      builder.withOrigins("http://localhost:4200"))
      .allowAnyHeader();

   ...

   app.UseMvc();
}