发布未在预检过程中阻止CORS策略,即使我已将其添加到拦截器中,也没有显示“ Access-Control-Allow-Origin”标头

时间:2019-07-11 20:56:06

标签: angular asp.net-web-api cors

使用:Angular 7,.net核心,Web API

我最近将我的应用程序更改为使用Windows身份验证,现在我曾经工作的请求对任何发布和放置(获取作品)都失败了。我得到

Access to XMLHttpRequest at 'https://localhost:44372/api/tasks' from 
origin 'http://localhost:4200' has been blocked by CORS policy: Response 
to preflight request doesn't pass access control check: No 'Access- 
Control-Allow-Origin' header is present on the requested resource.

我必须添加一个角度拦截器才能使get请求与启用Windows身份验证一起工作。

@Injectable()
export class CredentialsInterceptor implements HttpInterceptor {

intercept(request: HttpRequest<any>, next: HttpHandler): 
Observable<HttpEvent<any>> {
    request = request.clone({
        withCredentials: true
    });
    return next.handle(request);
  }
}

我的startup.cs正在添加这样的CORS(我必须设置setIsOriginAllowed才能使get请求起作用)

services.AddCors(o => o.AddPolicy("AllowAll", builder =>
        {
            builder.SetIsOriginAllowed((host) => true)
                   .AllowAnyMethod()
                   .AllowAnyHeader()
                   .AllowCredentials();
        }));

...//Configure
app.UseCors("AllowAll");
app.UseMvc(routes =>
{
    ...

我也尝试过指定来源或方法     .WithOrigins(“ https://localhost:4200”,“ http://localhost:4200”) 要么     .AllowAnyOrigin()

以及在拦截器中手动添加标头

intercept(request: HttpRequest<any>, next: HttpHandler): 
Observable<HttpEvent<any>> {
    request = request.clone({
        withCredentials: true
    });
    request.headers.append('Access-Control-Allow-Origin', 'http://localhost:4200');
    return next.handle(request);

我想念什么?我已经搜寻了几个小时。我了解如果未指定允许的来源,则会阻止CORS。其他StackOverflows表示它不能是客户端,但我认为客户端请求未发送“ Access-Control-Allow-Origin”标头。如何测试以确保已设置标头?为什么要上班而不提出要求?

2 个答案:

答案 0 :(得分:0)

所有其他帖子都指出了问题所在,但没有给出解决方案。放置OPTIONS请求时未放置授权头。我可以发出GET请求,因为会传递Windows身份验证标头,但是当我发出PUT请求时,必须首先发送不包含标头的OPTIONS。

为了使服务器允许使用OPTIONS,我必须允许对OPTIONS进行匿名身份验证。我是在项目属性->调试部分中选择它的。

答案 1 :(得分:-1)

服务器必须在响应中设置标头。在没有用的客户端请求中设置它。尝试使用邮递员之类的工具向api端点发出请求,并查看服务器在响应中设置了哪些标头。

服务器端代码中最有可能导致此问题的问题。