ASP.NET Core Web API 跨域(CORS) Cookie問題

身爲一個Web API,處理來自跨域不一樣源的請求,是一件十分合理的事情。html

先上已有的文章,快速複製粘貼,啓用CORS:跨域

Microsoft:啓用 ASP.NET Core 中的跨域請求 (CORS)瀏覽器

ASP.NET Core 配置跨域(CORS)cookie

若是按照以上文章,一步一步操做,你會發現,雖然能跨域請求了,可是即便客戶端開了(xhr.withCredentials = true)也沒法將Cookie發送給API。網絡

關於AllowAnyOriginapp

這是由於請求的首部中攜帶了 Cookie 信息,若是 Access-Control-Allow-Origin 的值爲「*」,請求將會失敗。而將 Access-Control-Allow-Origin 的值設置爲 http://foo.example,則請求將成功執行。

PS: 雖然API用Cookie不是很合理,但有時舊接口改造升級卻不得不瞎搞,呵呵。cors

爲何?ui

先看遍原理:spa

阮一峯的網絡日誌: 跨域資源共享 CORS 詳解.net

在來篇詳細的:

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

http://www.javashuo.com/article/p-qzhyabmq-bv.html

聲明

本文采用知識共享署名-非商業性使用-相同方式共享 2.5 中國大陸許可協議進行許可,發表在CSDN博客園,歡迎讀者轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接!請讀者/爬蟲們尊重版權

相關文章
相關標籤/搜索