You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 12:54:03