为什么 AspNet Core 2.2 服务器端创建的 cookie 在 Facebook WebView 中丢失?
Why AspNet Core 2.2 server side created cookie missing in Facebook WebView?
我们 运行 使用 aspnet core 2.2 和 Facebook WebView (https://developers.facebook.com/docs/messenger-platform/webview/) 时出现问题。
此问题仅在使用 messenger.com 或 facebook.com 中的聊天功能的桌面浏览器中出现。
我们开发了一个聊天机器人,对话中有按钮。当用户单击该按钮时,WebView 会显示我们的网页。
这个网络应用程序是一个 aspnet 核心 mvc 网络应用程序(在 Azure 应用程序服务中托管),其中服务器端的控制器操作创建一个 cookie 并将其写入响应。
var cookieOptions = new CookieOptions()
{
IsEssential = true,
Expires = DateTime.UtcNow.AddYears(1),
};
Response.Cookies.Append("COOKIE_NAME", "cookievalue", cookieOptions);
当此页面从 Facebook WebView(从 FB 聊天机器人)加载时,上面创建的 cookie(在服务器端)丢失。
在aspnet core web项目中Startup.cscookie中间件是这样配置的:
public void ConfigureServices(IServiceCollection services)
{
...
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => false;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
app.UseCookiePolicy();
...
}
我尝试过的:
- 如果从客户端插入相同的 cookie javascript,则该 cookie 在 Facebook webview 中可用。
document.cookie = "COOKIE_NAME=cookievalue";
相同的场景使用 asp.net fwk 4.7.2 和 Facebook webview 可以正常工作。
从移动应用程序(信使)它按我预期的那样工作,cookie 可用
我认为问题的根源可能在 WebView 中,因为从普通浏览器加载页面时该页面工作正常 – 而不是从 WebView(Chrome、IE、Edge、FF、Safari 等)加载,两者cookie(创建的服务器和客户端)可用。
使用 aspnet core 2.2 和 Facebook WebView 的场景可能有什么问题?
感谢您的帮助!
最后我发现了问题。 chrome 的 cookie 策略设置已更改:https://www.google.com/chrome/privacy/
这就是为什么我 运行 陷入上述问题。
解决方法:
我必须将这些 cookie samesite 设置更改为 'SameSiteMode.None'.
var cookieOptions = new CookieOptions()
{
Secure = true,
SameSite = SameSiteMode.None,
IsEssential = true,
Expires = DateTime.UtcNow.AddYears(1),
};
我们 运行 使用 aspnet core 2.2 和 Facebook WebView (https://developers.facebook.com/docs/messenger-platform/webview/) 时出现问题。
此问题仅在使用 messenger.com 或 facebook.com 中的聊天功能的桌面浏览器中出现。 我们开发了一个聊天机器人,对话中有按钮。当用户单击该按钮时,WebView 会显示我们的网页。 这个网络应用程序是一个 aspnet 核心 mvc 网络应用程序(在 Azure 应用程序服务中托管),其中服务器端的控制器操作创建一个 cookie 并将其写入响应。
var cookieOptions = new CookieOptions()
{
IsEssential = true,
Expires = DateTime.UtcNow.AddYears(1),
};
Response.Cookies.Append("COOKIE_NAME", "cookievalue", cookieOptions);
当此页面从 Facebook WebView(从 FB 聊天机器人)加载时,上面创建的 cookie(在服务器端)丢失。
在aspnet core web项目中Startup.cscookie中间件是这样配置的:
public void ConfigureServices(IServiceCollection services)
{
...
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => false;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
app.UseCookiePolicy();
...
}
我尝试过的:
- 如果从客户端插入相同的 cookie javascript,则该 cookie 在 Facebook webview 中可用。
document.cookie = "COOKIE_NAME=cookievalue";
相同的场景使用 asp.net fwk 4.7.2 和 Facebook webview 可以正常工作。
从移动应用程序(信使)它按我预期的那样工作,cookie 可用
我认为问题的根源可能在 WebView 中,因为从普通浏览器加载页面时该页面工作正常 – 而不是从 WebView(Chrome、IE、Edge、FF、Safari 等)加载,两者cookie(创建的服务器和客户端)可用。
使用 aspnet core 2.2 和 Facebook WebView 的场景可能有什么问题?
感谢您的帮助!
最后我发现了问题。 chrome 的 cookie 策略设置已更改:https://www.google.com/chrome/privacy/ 这就是为什么我 运行 陷入上述问题。
解决方法: 我必须将这些 cookie samesite 设置更改为 'SameSiteMode.None'.
var cookieOptions = new CookieOptions()
{
Secure = true,
SameSite = SameSiteMode.None,
IsEssential = true,
Expires = DateTime.UtcNow.AddYears(1),
};