zoukankan      html  css  js  c++  java
  • ASP.NET Core Web API 跨域(CORS) Cookie问题

    身为一个Web API,处理来自跨域不同源的请求,是一件十分合理的事情。

    先上已有的文章,快速复制粘贴,启用CORS:

    Microsoft:启用 ASP.NET Core 中的跨域请求 (CORS)

    ASP.NET Core 配置跨域(CORS)

    如果按照以上文章,一步一步操作,你会发现,虽然能跨域请求了,但是即使客户端开了(xhr.withCredentials = true)也无法将Cookie发送给API。

    关于AllowAnyOrigin

    这是因为请求的首部中携带了 Cookie 信息,如果 Access-Control-Allow-Origin 的值为“*”,请求将会失败。而将 Access-Control-Allow-Origin 的值设置为 http://foo.example,则请求将成功执行。
    

    PS: 虽然API用Cookie不是很合理,但有时旧接口改造升级却不得不瞎搞,呵呵。

    为什么?

    先看遍原理:

    阮一峰的网络日志: 跨域资源共享 CORS 详解

    在来篇详细的:

    MDN: HTTP访问控制(CORS)

    MDN: HTTP cookies

    进一步了解:

    紫云飞: SameSite Cookie,防止 CSRF 攻击

    跳过简单请求和预检请求不谈(不代表不重要),我们会发现一个叫SameSite的东西,是它告诉浏览器不要将Cookie发给非同源的Web API的,默认情况下,ASP.NET Core Web API 是启用的。所以配置下关闭即可。

    ......
    
    services.AddCors(options =>
    {
        options.AddPolicy("any", policyBuilder =>
        {
            policyBuilder.AllowAnyMethod()
                .AllowAnyHeader()
                //.WithMethods("GET", "HEAD", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "DEBUG");
                .AllowCredentials();//指定处理cookie
    
            var cfg = Configuration.GetSection("AllowedHosts").Get<List<string>>();
            if (cfg == null || cfg.Contains("*")) policyBuilder.AllowAnyOrigin(); //允许任何来源的主机访问
            else policyBuilder.WithOrigins(cfg.ToArray()); //允许类似http://localhost:8080等主机访问
        });
    });
    
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });
    
    .....
    
    app.UseCors("any");
    app.UseCookiePolicy();
    

    .....
    
    services.AddCors(options =>
    {
        options.AddPolicy("any", policyBuilder =>
        {
            policyBuilder.AllowAnyMethod()
                .AllowAnyHeader()
                //.WithMethods("GET", "HEAD", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "DEBUG");
                .AllowCredentials();//指定处理cookie
    
            var cfg = Configuration.GetSection("AllowedHosts").Get<List<string>>();
            if (cfg == null || cfg.Contains("*")) policyBuilder.AllowAnyOrigin(); //允许任何来源的主机访问
            else policyBuilder.WithOrigins(cfg.ToArray()); //允许类似http://localhost:8080等主机访问
        });
    });
    
    
    services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(configureOptions =>
        {
            configureOptions.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None;
        });
    
    ......
    
    app.UseCors("any");
    app.UseAuthentication();
    
    

    参考

    https://docs.microsoft.com/zh-cn/aspnet/core/security/cors

    http://www.ruanyifeng.com/blog/2016/04/cors.html

    https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

    https://www.cnblogs.com/ziyunfei/p/5637945.html

    声明

    本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,发表在CSDN博客园,欢迎读者转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接!请读者/爬虫们尊重版权

  • 相关阅读:
    eclipse工具
    Tag
    JSP模版
    Eclipse断点调试
    JavaBean
    验证码设计
    在IE中提示404错误
    序列化与反序列化
    文件编码问题
    强类型,弱类型和推断类型
  • 原文地址:https://www.cnblogs.com/chasingdreams2017/p/11318083.html
Copyright © 2011-2022 走看看