asp.net-core - 为什么声明转换不会减小 cookie 大小?
问题描述
我正在使用 Azure AD (.net core 2.1) 并已注册我的应用并将其配置为将 AD 组作为声明返回。我还使用声明转换来删除除我的应用程序使用的三个组之外的所有组声明,这成功地消除了 100 多个组。我这样做是希望它会减少后续请求标头中 cookie 的大小,但事实并非如此。
我知道声明转换正在工作,因为我有一个简单的页面可以迭代列表中的声明,并且当我安装了过滤器时,它只正确显示了三个组。
由于 cookie 较大,我收到 HTTP 400 - Request too long。我可以通过修改 Web 服务器上的注册表来解决这个问题(如其他地方建议的那样https://support.microsoft.com/en-us/help/2020943/http-400-bad-request-request-header-too-long -response-to-http-request),但我真正的问题是,如果 cookie 的大小保持不变,过滤声明的意义何在?
我也很想知道是否有可以用来增加最大标头大小的应用程序设置,以避免修改注册表。
我不确定代码在这里是否真的相关,但这里有一些片段:
public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
var identity = principal.Identity as ClaimsIdentity;
if (identity != null)
{
var unused = identity.FindAll(GroupsToRemove).ToList();
unused.ForEach(c => identity.TryRemoveClaim(c));
}
return Task.FromResult(principal);
}
过滤器在 Startup.cs 中注册为单例:
services.AddSingleton<IClaimsTransformation, FilterGroupClaimsTransformation>();
解决方案
Brad 回答了为什么 cookie 大小没有通过使用声明转换来改变的问题。由于他的建议,这是我用来减小 cookie 大小的代码:
在 Startup.cs 中,ConfigureServices()...
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(...)
.AddCookie(options => options.Events.OnSigningIn = FilterGroupClaims);
}
private static Task<ClaimsPrincipal> FilterGroupClaims(CookieSigningInContext context)
{
var principal = context.Principal;
if (principal.Identity is ClaimsIdentity identity)
{
var unused = identity.FindAll(GroupsToRemove).ToList();
unused.ForEach(c => identity.TryRemoveClaim(c));
}
return Task.FromResult(principal);
}
private static bool GroupsToRemove(Claim claim)
{
string[] _groupObjectIds = new string[] { }; // pull from config or whereever
return claim.Type == "groups" && !_groupObjectIds.Contains(claim.Value);
}
对于我的最终解决方案,我将静态方法移到了另一个类中,但为了简洁起见,我将所有内容都保留在此处。使用此方法将 Cookie 大小从 6 个块减少到 2 个。
推荐阅读
- java - 是否有可能从 Java 中的构造函数“返回”字符串值?
- java - java:Elasticsearch 异常 [type=mapper_parsing_exception, reason=Failed to parse mapping [_doc]
- kubernetes - 如何使用 Vault 动态机密并将它们作为环境变量注入 Kubernetes 部署?
- python - 为什么 python2 在不同情况下打印 unicode 行为会发生变化?
- python - 在 python 数据框中,如果所有列的值都相同,如何选择行?
- windows - 如何让基于 Qt 的应用程序(例如媒体播放器示例)在 Windows 10 上播放视频
- c++ - 使用 libswresample 重采样音频,重采样后会留下少量噪音
- angular - 无法在 Angular 应用程序中集成完整的 ABAP 代码编辑器
- javascript - Firestore 将项目推送到嵌套数组
- javascript - 无法更改作为字符串传递的 DOM 元素样式