我有一个IdentityServer4,当用户有大约10个角色时,cookie似乎呈指数增长。每次我尝试登录时,由于cookie太大,都会收到一个400错误的请求,时间太长。
我收到的Cookie分为5个块,大小约为4008:
这些cookie似乎是在应用程序的signin-oidc端点上设置的。
我正在使用身份服务器中的默认cookie设置-那里没有更改。
任何想法会导致这些Cookie增长如此之快? Id_token和Access_token的大小似乎比这些cookie小得多。
编辑:我分配给用户的每个角色似乎还向块中的最后一个cookie增加了400个大小,这对我来说似乎很大?
编辑2:我正在使用自定义配置文件服务,这会影响最终cookie的大小:
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var subjectId = context.Subject.GetSubjectId();
var user = await _userManager.FindByIdAsync(subjectId);
if (user == null) return;
var claims = new List<Claim>
{
new Claim("username", user.UserName),
new Claim("email", user.Email),
new Claim("firstname", user.FirstName),
new Claim("lastname", user.LastName)
};
var roles = await _userManager.GetRolesAsync(user);
foreach (var role in roles)
{
claims.Add(new Claim("role", role));
}
var userClaims = await _userManager.GetClaimsAsync(user);
foreach (var userClaim in userClaims)
{
claims.Add(new Claim(userClaim.Type, userClaim.Value));
}
context.IssuedClaims = claims;
}
正在增长的是应用程序身份验证cookie,而不是身份服务器cookie。
并且您假设很好,cookie正在增长,因为它会加密所有声明],包括cookie中的角色,以在服务器调用之间保留它们。
替代解决方案是将IdentityServer配置为仅传递在首次登录时整个应用程序生命周期中所需的最少数量的用户数据。您可能需要“在某些时候”进行的其他所有操作,都可以使用access_token
通过对用户信息端点
access_token
生存期成为问题,因为与cookie不同,它没有滚动到期。其他选择是为您的Web应用程序启用会话
,并将cookie数据而不是cookie本身存储到会话存储中。