Internet explorer IE或边缘打印对话框在没有会话的情况下向服务器发送请求(因为SameSite=Lax on session cookie)

Internet explorer IE或边缘打印对话框在没有会话的情况下向服务器发送请求(因为SameSite=Lax on session cookie),internet-explorer,cookies,microsoft-edge,printdialog,samesite,Internet Explorer,Cookies,Microsoft Edge,Printdialog,Samesite,我有一个asp.net网站,用户可以登录,成员可以通过Ctrl+p获得报告或打印页面 最近,当我的会员在IE中打开我的网站并尝试打印时,他们已注销 为什么?? 因为IE打印对话框在没有会话cookie的情况下向服务器发送一些请求,所以StateServer为该客户端释放新会话,然后用户注销 为什么打印对话框发送请求? 我不知道,但我猜IE打印对话框会尝试渲染页面并准备打印 为什么打印对话框不发送当前会话cookie? 因为.net的新更新为会话cookie设置了SameSite=lax,所以来自

我有一个asp.net网站,用户可以登录,成员可以通过Ctrl+p获得报告或打印页面

最近,当我的会员在IE中打开我的网站并尝试打印时,他们已注销

为什么?? 因为IE打印对话框在没有会话cookie的情况下向服务器发送一些请求,所以StateServer为该客户端释放新会话,然后用户注销

为什么打印对话框发送请求? 我不知道,但我猜IE打印对话框会尝试渲染页面并准备打印

为什么打印对话框不发送当前会话cookie? 因为.net的新更新为会话cookie设置了SameSite=lax,所以来自打印对话框的请求无法发送当前会话cookie。

如何防止IE打印对话框发送请求? 或者如何强制IE打印对话框发送相同的会话cookie

有什么想法吗

编辑: 我创建了一个示例项目来说明这个问题。您可以在IIS上下载我的项目和主机,然后打开Default.Aspx并尝试在IE(或edge)中打印该页面。 你会看到我的问题的。
我重现了这个问题,似乎当我们打印页面时,它会调用DownloadHandler来加载图像。此时,由于会话为空,因此图像不会显示

为了解决这个问题,我建议您可以尝试使用QueryString方法将登录状态转移到DownloadHandler,而不是使用会话状态

请尝试按以下方式修改您的代码:

Default.aspx

<img src="" runat="server" id="image" />
下载处理程序:

        bool.TryParse(context.Request.QueryString["LoginOK"]?.ToString(), out bool hasAccess);

        if (!hasAccess)
        {
            context.Response.Redirect("./Error.aspx");
            return;
        }

使用上面的代码,当单击print选项时,它也会向DownLoadHandler发送一个请求,但是我们可以根据查询字符串加载图像。打印网页后,我们仍然可以在主页中使用
会话[“LoginOK”]
(默认)(如果会话未过期)。

我确认问题。目前,作为一种解决方法,一旦删除SameSite属性,问题就会消失。这不是最佳的解决方案,但目前似乎有效

var cookies = this.Response.Cookies;
FormsAuthentication.SetAuthCookie( "JohnDoe", rememberMe );
var allCookies = cookies.AllKeys.Select( key => cookies[key] ).ToList();
allCookies.ForEach( cookie => cookie.SameSite = (SameSiteMode)(-1) );
在ASP.NET Core 3.0及更高版本中,更改了SameSite默认值,以避免与不一致的客户端默认值冲突。以下API已将默认值从SameSiteMode.Lax更改为-1,以避免为这些cookie发出SameSite属性

我们所做的事情是创建了HttpModule,它在响应中查找cookies并相应地修改它们。

找到了修复方法:

您必须在会话状态标记中设置
cookieSameSite=“None”
,以避免此问题。我已经尝试过了,并且在所有浏览器中都运行良好

<sessionState cookieSameSite="None" cookieless="false" timeout="360">
</sessionState>


据我所知,当使用Ctrl+P打开IE浏览器打印视图时,这是浏览器的行为,它将打印当前页面而不发送请求。我建议您检查您的代码,是否设置了会话cookie过期时间,以及cookie是否过期。此外,您使用的是哪一版本的IE浏览器?您可以发布相关代码和步骤来重现问题吗?请在ie(或edgh)中打开此页面,然后打开浏览器开发工具->网络选项卡,然后按页面上的ctrl+P,您将看到一些请求发送到服务器并打印对话框重试渲染页面。我已创建了一个具有表单身份验证的web应用程序,似乎当我按下页面上的ctrl+P时,它只是从缓存中获取CSS和JavaScript文件(或刷新这些文件),而主页不会刷新。截图像。那么,请检查您使用的是哪种身份验证?您是否正在使用IE浏览器版本的版本?是否为css和javascript文件设置权限,而不是缓存这些文件。此外,请检查F12开发者网络工具,确保它没有启用“始终从服务器刷新”选项。@ZhiLv MSFT:谢谢您的回复。我编辑我的帖子并添加一个示例项目。你可以看到我在这方面的问题。谢谢你的回答,但这不是一个好主意,因为它有安全问题,每个人都可以通过以下链接调用我的DownloadHandler:./DownloadHandler.ashx?LoginOK=True你也可以尝试在不使用DownloadHandler.ashx的情况下显示图像。对于图像文件的安全性,如果您不希望匿名用户访问它们,您可以参考。这只是一个示例项目,在我的主项目中,DownloadHandler从DB加载图像,我无法更改我的方法。此外,还应设置安全标志。有关SameSite行为的更多信息
<sessionState cookieSameSite="None" cookieless="false" timeout="360">
</sessionState>