我有一个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本身)存储到服务器端会话存储中。
更新:
关于您的GetProfileDataAsync
,它会加载所有声明,这很好,但是随后您在IdentityResources
配置中进行了配置,该筛选器过滤了您实际希望传递给客户端的声明。IdentityServer的配置是一个太大的话题,无法在SO问题中进行详细讨论。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句