遵循微软教程后 ASP .NET Cookie 太大

Posted

技术标签:

【中文标题】遵循微软教程后 ASP .NET Cookie 太大【英文标题】:ASP .NET Cookie too large after following microsoft tutorial 【发布时间】:2022-01-20 16:01:33 【问题描述】:

我正在学习本教程: https://docs.microsoft.com/en-us/graph/tutorials/aspnet-core?tutorial-step=3 这基本上在登录后向用户身份添加了自定义声明。其中一项声明是存储为 base64 字符串的用户个人资料图片。但是,这会使 cookie 太大,并且网络服务器无法加载该站点。这是添加图片的代码:

var photo = await graphClient.Me
                                .Photo
                                .Content
                                .Request()
                                .GetAsync();



var memoryStream = new MemoryStream();
photo.CopyTo(memoryStream);
var photoBytes = memoryStream.ToArray();

photoUrl = $"data:image/png;base64,Convert.ToBase64String(photoBytes)";

照片是从 Microsoft Graph API 获取的,并以 Stream 的形式返回,我将其转换为 base64 字符串。我错过了什么吗?任何帮助将不胜感激。

【问题讨论】:

图片文件转Base64后有多大? Cookie 的限制为 4096 字节。请参考文档:Asp.Net Cookies您可以随时将图像保存在 Session 中。 嘿,这个图像相当大,它有 58k 字节。然而,这成为今天的一个问题,昨天它工作得很好。唯一的区别是一些 Windows 10 更新,我怀疑这与问题有关。 Cookies 作为标头发送,红隼的默认限制为 32KB,如果需要,您可以增加:docs.microsoft.com/en-us/dotnet/api/…。 @Artur 浏览器,然而,每个来源往往有大约 4096 字节 (4KB) 的限制:chromestatus.com/feature/4946713618939904:“用户代理现在需要限制 cookie 名称和value 为 4096 字节,并将每个 cookie 属性值的长度限制为 1024 字节" @Dai 你是对的。但是 4KB 的限制是针对单个 cookie 的。 Asp.Net Core 自动将大于 4KB 的 cookie 拆分成块。我相信 OP 的问题是发送到服务器的所有 cookie 的总大小超过了 max MaxRequestHeadersTotalSize 【参考方案1】:

问题是我从 API 获取图像时没有压缩图像。下面的代码解决了这个问题:

var photo = await graphClient.Me
    .Photos["48x48"]
    .Content
    .Request()
    .GetAsync();

var memoryStream = new MemoryStream();
photo.CopyTo(memoryStream);
var photoBytes = memoryStream.ToArray();

photoUrl = $"data:image/png;base64,Convert.ToBase64String(photoBytes)";

Photos 数组的索引是关键。

【讨论】:

这仍然是一个非常糟糕的方法:Cookie 的大小不应超过 1-4KB,但大多数图像将超过 10KB。无论是使用 data: URI 还是 Base64 编码,您都不应该在 cookie 中存储大值。而是将图像数据存储在一些可公开访问的缓存中(通过 HTTPS)并存储对该 blob 的 reference

以上是关于遵循微软教程后 ASP .NET Cookie 太大的主要内容,如果未能解决你的问题,请参考以下文章

ASP .NET Core OpenID Connect - 在外部登录后发出我自己的 cookie?

asp.net webservice cookie 保存后NAME有值,Value却没有值 代码如下:

在 cookie 中存储 JWT 令牌后,如何在 ASP.NET Core 3.1 中破坏该 cookie 并获取信息

Azure 部署后 ASP.NET Core MVC webapp 错误

ASP.NET Identity教程ASP.NET Identity入门

无法在 ASP.NET 中更新 cookie