/// <summary> /// Transformuje claims principla - přidá custom claims. /// </summary> public Task <ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal) { UserContextInfo userContextInfo = contextInfoBuilder.GetUserContextInfo(principal); // pro nepřihlášeného uživatele žádnou transformaci neprovádíme if (userContextInfo == null) { return(Task.FromResult(principal)); } List <Claim> customClaims = claimsCacheStore.GetClaims(userContextInfo); if (customClaims == null) { // pokud nejsou žádné claims v cache, získáme je a do cache uložíme, // ať je pro stejný context další request rychlejší customClaims = customClaimsBuilder.GetCustomClaims(principal); claimsCacheStore.StoreClaims(userContextInfo, customClaims); } // zduplikujeme identity a claims tak, že k duplikátům přidáme custom claim // pokud bychom přidávali claims do principal, který je parametrem, může se stát (a stalo se!), že se v identity objeví claims vícekrát ClaimsIdentity claimsIdentity = ((ClaimsIdentity)principal.Identity).Clone(); claimsIdentity.AddClaims(customClaims); ClaimsPrincipal claimsPrincipalWithCustomClaims = new ClaimsPrincipal(claimsIdentity); return(Task.FromResult(claimsPrincipalWithCustomClaims)); }
public void StoreClaims(UserContextInfo userContextInfo, List <Claim> claims) { cache.Set(GetCacheKey(userContextInfo), claims, new MemoryCacheEntryOptions { Priority = CacheItemPriority.Low, AbsoluteExpirationRelativeToNow = new TimeSpan(0, 15, 0) /* 15 minut */ }); }
public List <Claim> GetClaims(UserContextInfo userContextInfo) { if (cache.TryGetValue(GetCacheKey(userContextInfo), out List <Claim> result)) { return(result); } return(null); }
/// <summary> /// Získá custom claims pro daný principal. /// </summary> public List <Claim> GetCustomClaims(ClaimsPrincipal principal) { Contract.Requires(principal.Identity.IsAuthenticated); List <Claim> result = new List <Claim>(); UserContextInfo userContextInfo = userContextInfoBuilder.GetUserContextInfo(principal); // TODO: Doplnit custom claims (nebo odstranit celou mašinérii v této složce. return(result); }
public override bool Equals(object obj) { if (ReferenceEquals(this, obj)) { return(true); } UserContextInfo userContextInfoObj = (UserContextInfo)obj; if (userContextInfoObj == null) { return(false); } return(this.username == userContextInfoObj.username); }
private object GetCacheKey(UserContextInfo userContextInfo) { // implementace má přetížen GetHashCode i Equals return(userContextInfo); }