Un de mes collègues a récemment travaillé sur un problème de cookie pour une application “backend” .NET en utilisant le cookie pour valider une certaine logique métier. Voici comment procéder.
Le contexte du problème
Le projet utilisait une infrastructure basée sur plusieurs pods (c’est-à-dire une VM) utilisant Openshift pour équilibrer la charge du frontend et du backend.
Sur le projet, nous avons utilisé Redis pour stocker les cookies.
Le problème
Sans répartition de charge active, aucun problème n’est survenu. L’application posait les cookies et les applications fonctionnaient comme prévu.
Lorsque le projet l’a activé, les applications ont cessé de fonctionner.
Pourquoi ?
La solution
Les cookies nécessaires au fonctionnement de la logique métier étaient absents.
Comment mon collègue a-t-il résolu le problème ?
Tout d’abord, il a créé une classe de magasin de session pour gérer les opérations CRUD dans le cache Redis :
Ensuite, mon collègue a ajouté la classe cookie manager en tant que Singleton dans la méthode d’extension enregistrant les services (public static void RegisterServices(this IServiceCollection services, IConfigurationRoot configuration, bool isTestEnvironment)).
Enfin, mon collègue a mis à jour le code de démarrage de Program.cs pour utiliser la nouvelle dépendance dont on avait besoin pour lire le cookie de OpenIdConnect :
publicpartialclassProgram{privateconststringAPI_CORS_POLICY="ApiCorsPolicy";publicstaticvoidMain(string[]args){varbuilder=WebApplication.CreateBuilder(args);// Dependency Injection for Servicesbuilder.Services.RegisterServices(Configuration);// Dependency Injection for Controllersbuilder.Services.RegisterControllers(Configuration);// Register Loggersbuilder.Logging.RegisterLoggingProviders(Configuration,builder.Services);builder.AddCookie().AddOpenIdConnect(options=>{// ... some code is omitted for brevityOnTokenValidated=context=>{varidToken=context.SecurityToken.RawData;// Token IDvaraccessToken=context.SecurityToken.RawData;// Access TokenvarrefreshToken=context.SecurityToken.RawData;// Refresh TokenvarsessionId=context.Principal.FindFirst(ClaimTypes.NameIdentifier)?.Value;varkey=$"{sessionId}:cookies:app-auth";context.HttpContext.RequestServices.GetRequiredService<ICookieManager>().AppendResponseCookie(context.HttpContext,key,accessToken,newCookieOptions());returnTask.CompletedTask;}};});varapp=builder.Build();app.Run();}}