c# - Caching Claims in .net core 2.0 -


looked everywhere looks stuck right now. using windows active directory in application authentication. authorization, using claims. after searching through limited .net core documentation, how code looks like.

startup.cs

public void configureservices(iservicecollection services)     {         services.addtransient<iprincipal>(             provider => provider.getservice<ihttpcontextaccessor>().httpcontext.user);         services.addtransient<iclaimstransformation, claimstransformer>();         services.addauthentication(iisdefaults.authenticationscheme);      } 

claimstransformer.cs

class claimstransformer : iclaimstransformation {    public task<claimsprincipal> transformasync(claimsprincipal principal)    {  // call database more claims based on user id claimsidentity.name      ((claimsidentity)principal.identity).addclaim(new claim("now",datetime.now.tostring()));      return task.fromresult(principal);    } } 

but problem is, code called every request , claims loaded db every time absolutely wrong. there way can cache it? able create cookie of claims , use cookie further calls in .net 4.0. can't seem find way in core. documentation check, incomplete or not cover scenario. able claims further in application how documentation says here: https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims

but there no mention caching claims.

anyone in same boat? or knows way out of it?

you can inject imemorycache service in claimstransformer constructor.

using microsoft.extensions.caching.memory;  public class claimstransformer : iclaimstransformation {     private readonly imemorycache _cache;      public claimstransformer(imemorycache cache)     {         _cache = cache;     }      public async task<claimsprincipal> transformasync(claimsprincipal principal)     {         var cachekey = principal.findfirstvalue(claimtypes.nameidentifier);          if (_cache.trygetvalue(cachekey, out list<claim> claims)         {             ((claimsidentity)principal.identity).addclaims(claims);         }         else         {             claims = new list<claim>();                        // call database more claims based on user id claimsidentity.name              _cache.set(cachekey, claims);         }          return principal;     } } 

Comments