IdentityServer4 Client Secret默认长度报错及超长client_secret发送方法问询
IdentityServer4 发送超过101字符client_secret的解决方法
IdentityServer4默认对client_secret的入参校验和存储长度限制为101字符,超过该长度会直接抛出Client_Invalid错误,可通过以下两种方案解决:
方案一:调整服务端长度限制(适用于需提交明文Secret的场景)
如果你的业务场景必须提交明文形式的长client_secret,可在服务端修改两处配置:
- 修改入参长度校验阈值:在IdentityServer4服务注册代码中调整输入长度限制
builder.Services.AddIdentityServer(options => { // 按需调整为你需要的最大长度,建议和存储层配置保持一致 options.InputLengthRestrictions.ClientSecret = 2000; }) // 其余配置保留,比如AddInMemoryClients、AddConfigurationStore等
- 若使用EF Core做配置存储,同步修改数据库字段长度限制:在配置DbContext的模型构造方法中修改
ClientSecret的Value字段长度
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<ClientSecret>(entity => { entity.Property(p => p.Value).HasMaxLength(2000); }); }
修改后需要执行迁移并更新数据库配置。
方案二:提交哈希后的Secret值(更推荐,无需修改服务端默认配置)
IdentityServer4默认仅校验SHA256哈希后的Secret值,无需提交明文Secret。你可以先对长明文Secret做哈希处理,再将哈希值作为client_secret提交,生成的哈希值固定为44字符,远低于默认101的长度限制。
- C# 哈希计算示例(可直接调用IdentityServer4内置扩展方法):
using IdentityServer4.Models; // 输入为你的长明文Secret,输出为符合要求的哈希值 string hashedClientSecret = "你的长明文client_secret".Sha256();
- 其他语言可自行实现SHA256哈希后转Base64字符串的逻辑即可。
注意:若采用此方案,服务端存储的Client Secret也需要对应为相同算法生成的哈希值,不能存明文。
内容的提问来源于stack exchange,提问作者rajquest
相关产品推荐
相关产品推荐

