CORS:凭据模式为“包含”


99

是的,我知道您在想什么-另一个CORS问题,但是这次我很困惑。

因此,开始时,实际的错误消息为:

XMLHttpRequest无法加载http://localhost/Foo.API/token。当请求的凭据模式为'include'时,响应中'Access-Control-Allow-Origin'标头的值不得为通配符'* '。因此,不允许访问源' http:// localhost:5000 '。XMLHttpRequest发起的请求的凭据模式由withCredentials属性控制。

我不确定凭证模式的含义是'include'吗?

因此,当我在邮递员中执行请求时,没有遇到这样的错误:

在此处输入图片说明

但是,当我通过我的angularjs Web应用访问相同的请求时,我为这个错误感到困惑。这是我的angualrjs请求/响应。如您所见,响应为OK 200,但我仍然收到CORS错误:

提琴手的请求和响应:

下图演示了Web前端对API的请求和响应

提琴手

因此,根据我在网上阅读的所有其他帖子,似乎我在做正确的事情,这就是为什么我无法理解该错误的原因。最后,这是我在angualrjs(登录工厂)中使用的代码:

在此处输入图片说明

API中的CORS实现-参考目的:

方法1:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        EnableCrossSiteRequests(config);
    }

    private static void EnableCrossSiteRequests(HttpConfiguration config)
    {
        var cors = new EnableCorsAttribute("*", "*", "*")
        {
            SupportsCredentials = true
        };
        config.EnableCors(cors);
    }
}

使用的方法2:

public void Configuration(IAppBuilder app)
{
    HttpConfiguration config = new HttpConfiguration();

    ConfigureOAuth(app);

    WebApiConfig.Register(config);
    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
    app.UseWebApi(config);

}

提前谢谢了!


漂亮的照片,它们是什么?要回答您的问题,如果您包括身份验证,则access-control-allow-origin响应必须是原始(浏览器页面)主机,它不能*-因此,服务器端在做CORS错误-哦,邮递员工作是因为这不是跨源请求
Jaromanda X

@JaromandaX,感谢您的回复。这些图片演示了请求/响应以及演示了正在传递的标头。您问的问题,显然是它没有实现目标……
理查德·贝利

我的评论应该是您需要知道的-不需要看图片
Jaromanda X

因此,最近我决定不再使用网络api上的cookie,而是使用令牌。当我使用cookie时,我的CORS可以正常工作。因此,我努力了解如何在服务器端未正确实现CORS
Richard Bailey

1
如果您包括身份验证,则access-control-allow-origin响应必须是原始(浏览器页面)主机,而不能是*
Jaromanda X

Answers:


103

问题源于您的Angular代码:

什么时候 withCredentials设置为true时,它将尝试与请求一起发送凭据或cookie。因为这意味着另一个来源可能正在尝试执行经过身份验证的请求,所以不允许将通配符(“ *”)用作“ Access-Control-Allow-Origin”标头。

您必须在“ Access-Control-Allow-Origin”标头中明确发出请求的来源,才能使此工作生效。

我建议将要允许进行身份验证的请求的来源明确列入白名单,因为仅用请求中的来源进行响应就意味着如果用户碰巧有一个有效的会话,则任何给定的网站都可以对您的后端进行身份验证的调用。

我在前一段时间写的这篇文章中解释了这些内容。

因此,您可以将其设置withCredentials为false或实施来源白名单,并在涉及凭据时以有效的来源响应CORS请求


3
我正在使用TypeScript开发Angular 5应用程序。我需要将withCredentials设置为true,否则我将获得Authorization Failed异常。如何使用Credentials:true解决此问题
Ziggler,

@Ziggler我也有同样的情况。您找到解决方案了吗?
帕维尔

@Ziggler我罚款解决方案,请参阅我的答案。
帕维尔

1
使用WithCredentials = TRUE和Access-Control-Allow-Origin = [' localhost:4200']时,仍然出现此错误,并且我没有使用star *,因此该错误消息不再有意义。错误消息:“对预检请求的响应未通过访问控制检查:当请求的凭据模式为“包括”时,响应中“ Access-Control-Allow-Origin”标头的值不得为通配符*。因此,不允许' localhost:4200 '访问。XMLHttpRequest发起的请求的凭据模式由withCredentials属性控制。”
mruanova

@mruanova您确定在请求中正确设置了Access-Control-Allow-Origin标头吗?听起来好像某处使用通配符发送了某些消息
geekonaut


11

自定义Angular 5和Spring Security的CORS(Cookie基本解决方案)

在Angular方面,需要withCredentials: true为Cookie传输添加选项标志:

constructor(public http: HttpClient) {
}

public get(url: string = ''): Observable<any> {
    return this.http.get(url, { withCredentials: true });
}

在Java服务器端上,需要添加CorsConfigurationSource配置CORS策略:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        // This Origin header you can see that in Network tab
        configuration.setAllowedOrigins(Arrays.asList("http:/url_1", "http:/url_2")); 
        configuration.setAllowedMethods(Arrays.asList("GET","POST"));
        configuration.setAllowedHeaders(Arrays.asList("content-type"));
        configuration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and()...
    }
}

configure(HttpSecurity http)默认情况下,方法将corsConfigurationSource用于http.cors()


1

如果有帮助,我在我的reactjs应用程序中使用了离心机,在检查了以下一些注释之后,我查看了centrifuge.js库文件,该文件在我的版本中具有以下代码段:

if ('withCredentials' in xhr) {
 xhr.withCredentials = true;
}

在删除了这三行之后,该应用程序按预期运行正常。

希望能帮助到你!


谢谢...这节省了我很多时间!:)
pavan kumar chaitanya

1

如果使用的是.NET Core,则在Startup.CS中配置CORS时必须使用.AllowCredentials()。

在ConfigureServices内部

services.AddCors(o => {
    o.AddPolicy("AllowSetOrigins", options =>
    {
        options.WithOrigins("https://localhost:xxxx");
        options.AllowAnyHeader();
        options.AllowAnyMethod();
        options.AllowCredentials();
    });
});

services.AddMvc();

然后在Configure里面:

app.UseCors("AllowSetOrigins");
app.UseMvc(routes =>
    {
        // Routing code here
    });

对我来说,只是缺少options.AllowCredentials()导致了您提到的错误。通常,对于其他也有CORS问题的用户,要注意的是,顺序很重要,并且必须在Startup类中的AddMVC()之前注册AddCors()。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.