我有一个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;
}
答案 0 :(得分:1)
正在增长的是应用程序身份验证cookie,而不是身份服务器cookie。
您认为很好,cookie正在增长,因为它会加密所有声明,包括cookie中的角色,以在服务器调用之间保留它们。
另一种解决方案是将IdentityServer配置为仅传递在初始登录时整个应用程序生命周期中所需的最少数量的用户数据。您可能需要“在某些时候”进行的其他所有操作,都可以使用access_token
通过对 user-info端点的后端调用进行检索。这种方法的缺点是管理access_token
的生存期成为一个问题,因为与cookie不同,它没有滚动到期。
其他选择是为您的Web应用启用会话,并将cookie数据(而不是cookie本身)存储到服务器端会话存储中。
更新:
关于您的GetProfileDataAsync
,它会加载所有声明,这很好,但是随后您在IdentityResources
配置中进行了配置,该配置可以过滤您实际要传递给客户端的声明。 IdentityServer的配置是一个太大的话题,无法在SO问题中进行详细讨论。