【问题标题】:Bad Request - Request Too Long (IdentityServer4)错误请求 - 请求太长 (IdentityServer4)
【发布时间】:2020-09-24 10:30:35
【问题描述】:

我有一个 IdentityServer4,当用户有大约 10 个角色时,cookie 似乎呈指数增长。现在每次我尝试登录时都会收到一个 400 错误请求太长,因为 cookie 太大了。

我收到的 cookie 被分成 5 个大小约为 4008 的块:

这些 cookie 似乎设置在应用程序的 signin-oidc 端点上。

我在身份服务器中使用默认的 cookie 设置 - 那里没有更改。

有什么想法会导致这些 cookie 增长得如此之快吗? Id_token 和 Access_token 的大小似乎比这些 cookie 小很多。

编辑:我分配给用户的每个角色似乎都将 400 大小添加到块中的最后一个 cookie,这对我来说似乎非常大?

编辑 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;
    }

【问题讨论】:

    标签: c# identityserver4


    【解决方案1】:

    增长的是应用程序身份验证 cookie,而不是身份服务器 cookie。

    您猜对了,cookie 正在增长,因为它加密了所有声明,包括 cookie 中的角色以在服务器调用之间保持它们。

    另一种解决方案是将 IdentityServer 配置为仅传递初始登录时整个应用程序生命周期所需的最少量用户数据。其他一切,您可能需要“在某个时候”,您可以使用access_token 通过对user-info endpoint 的后端调用来检索。这种方法的缺点是管理access_token 的生命周期成为一个问题,因为与cookie 不同,它没有滚动到期。

    其他选项是为您的网络应用启用会话,并将 cookie 数据存储到服务器端会话存储中,而不是 cookie 本身。

    更新:

    关于您的 GetProfileDataAsync,它会加载所有声明,这很好,但随后您在 IdentityResources 配置中配置过滤您实际想要传递给客户端的声明。 IdentityServer 的配置是太大的话题,无法在 SO question 中详细讨论。

    【讨论】:

    • 感谢您的回复,非常有用! Other option would be to enable session for your web app, and to store cookie data into the session storage, instead of the cookie itself. - 在添加 cookie 和 oidc 时,这会被配置为客户端配置的一部分吗?
    • 我忘了提到的是,我们的 IdentityServer3 实例似乎没有发生这个问题,考虑到我们所有用户的用户声明在两者中都是相同的,这使得这个问题更加令人困惑应用程序,它们都以相同的方式在客户端处理 cookie。
    • 可以,可以配置。我认为在 cookie 配置中。为了清楚起见,我提到了服务器端会话存储(SQL 或其他)。不是浏览器的会话存储。为此,cookie 身份验证配置有挂钩。
    • 关于 IdentityServer3,我现在能想到的唯一区别是配置略有不同。 Perhepas v3 在登录期间默认发出较少数量的声明?客户端应用程序 cookie 应该以相同的方式处理。
    • 啊,我明白了,我很抱歉。我将调查 SQL 会话存储。我正在使用自定义 ProfileService 来传递用户声明。也许我使用了不正确的配置。我将使用该代码编辑问题。
    猜你喜欢
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2018-02-16
    • 2021-07-01
    • 2019-01-09
    相关资源
    最近更新 更多