代码之家  ›  专栏  ›  技术社区  ›  Dominick

为什么声明转换不减少cookie的大小?

  •  4
  • Dominick  · 技术社区  · 6 年前

    我正在使用azure ad(.net core 2.1),并已注册我的应用程序,并将其配置为将广告组作为声明返回。我还使用声明转换来删除除我的应用程序使用的三个组之外的所有组声明,这成功地删除了100多个组。我这样做的目的是希望它能减少后续请求头中cookie的大小,但事实并非如此。

    无论我是否使用声明转换,cookie大小都是相同的: Cookie Size

    我知道claims转换是有效的,因为我有一个简单的页面来迭代列表中的声明,当我有了过滤器时,它只正确地显示了三个组。

    由于cookie太大,我得到的http 400请求太长。我可以通过修改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>();
    
    1 回复  |  直到 6 年前
        1
  •  5
  •   Dominick    6 年前

    brad回答了为什么使用claims转换时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块。