ASP.NET Core外部登录如何修改/signin-oidc生成的出站认证Cookie
解决方法
你可以通过OpenIdConnect中间件的OnTokenValidated事件拦截身份构造流程,在/signin-oidc生成认证Cookie、触发重定向之前裁剪不必要的声明,这是最直接的解决方案:
1. 注册事件裁剪声明
在AddOpenIdConnect的配置逻辑中添加如下事件处理:
builder.Services.AddAuthentication() .AddOpenIdConnect("oidc", options => { // 保留你原有配置不变 options.ResponseType = "code id_token"; options.SaveTokens = false; // 其他原有的Authority、ClientId、ClientSecret等配置 // 新增事件拦截逻辑 options.Events.OnTokenValidated = context => { // 按你的业务需要填写要保留的声明类型列表 var allowedClaimTypes = new List<string> { "sub", "name", "email", "role" }; var userIdentity = (ClaimsIdentity)context.Principal.Identity; // 移除所有不在保留列表中的声明 var uselessClaims = userIdentity.Claims .Where(c => !allowedClaimTypes.Contains(c.Type)) .ToList(); foreach (var claim in uselessClaims) { userIdentity.RemoveClaim(claim); } return Task.CompletedTask; }; });
OnTokenValidated事件触发时机刚好在IDP返回的身份凭证验证完成、认证Cookie生成之前,此处修改后的声明集合会直接用于后续Cookie构造,能从根源缩小Cookie体积。
2. 兜底方案:调整Cookie分片策略
如果裁剪后剩余声明的体积还是偏大,可以显式配置Cookie认证的分片阈值,将大Cookie自动拆分为多个小Cookie,避免单个Cookie超出大小限制:
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { // 自定义分片阈值,默认是4KB,可按需调低 options.CookieManager = new ChunkingCookieManager { ChunkSize = 2048 }; });
补充说明
被裁剪掉的声明不需要存在Cookie中,你可以在ExternalLoginCallback逻辑中,用授权码去IDP的UserInfo端点拉取完整的用户信息,按需使用即可。
内容的提问来源于stack exchange,提问作者Nate
相关产品推荐
相关产品推荐

