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 個。
