問題描述
公司用identityserver4作為授權認證中心,剛開始用着都毫無違和感,昨兒突然就登錄不上了;
問題分析
F12看了請求,發現是請求授權的時候失敗了...
回想了一下腦海里關於對identityserver4的些許理解,懷疑是證書的問題,因為當時制作證書的時候時間設置的有點短,可能過期了,於是一頓操作替換證書,重新部署請求,然而並不是...
既然猜測的不對,那就只能通過看服務端日志了,果然找到了一段日志:Showing login: User is not authenticated
打開百度,復制、粘貼一把梭,果然面向百度編程就是easy.
原因
由於最新版的Chrome的Cookie策略導致寫Cookie失敗,從而導致用戶認證的失敗.
SameSite=strict
:對於來自不同於源站的站點發出的請求,不發送cookie,為了防止CSRF攻擊。
SameSite=lax
:類似於strict,但是當用戶有意地通過單擊鏈接或發送表單啟動請求時,就會發送cookies。不會在腳本請求時發送。
SameSite=none
:無論請求來自哪里都可以(但是需要https)。
解決
問題找到了解決也就簡單了,把Cookie策略設置了lax即可(誰讓公司沒上https,才出了這么多事兒).
public void ConfigureServices(IServiceCollection services)
{
....
// 配置cookie策略
services.Configure<CookiePolicyOptions>(options =>
{
options.MinimumSameSitePolicy = Microsoft.AspNetCore.Http.SameSiteMode.Lax;
}
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
....
app.UseCookiePolicy();
}
解決問題的鏈接:https://www.e-learn.cn/topic/3672478
總結
- 其實這個問題公司的測試同事好久之前就出現過,只是因為自己的無知,當時自己無法復現這個問題,所以就沒有去重視它,所以珍惜測試同事提出的每個bug,進步就在眼前.
- 軟件想要持續的保持活力得不停的更新、迭代,不然就會被拋棄,小小的cookie都已經發展得這么復雜了...