Comment déchiffrer manuellement un ASP.NET Core cookie d'Authentification?
Prenons l'exemple d'un commun connu ASP.NET scénario de Base. Tout d'abord, nous ajoutons le middleware:
public void Configure(IApplicationBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
AuthenticationScheme = "MyCookie",
CookieName = "MyCookie",
LoginPath = new PathString("/Home/Login/"),
AccessDeniedPath = new PathString("/Home/AccessDenied/"),
AutomaticAuthenticate = true,
AutomaticChallenge = true
});
//...
}
Puis sérialiser un principal:
await HttpContext.Authentication.SignInAsync("MyCookie", principal);
Après ces deux appels cryptés cookie sera stocké sur le côté client. Vous pouvez voir le "cookie" (dans mon cas, c'était chunked) dans n'importe quel navigateur devtools:
Ce n'est pas un problème (et pas une question) à travailler avec les cookies de code de l'application.
Ma question est: comment décrypter le cookie en dehors de l'application? Je suppose que la clé privée est nécessaire pour que, comment l'obtenir?
J'ai vérifié le docs et trouvé que les mots communs:
Cela va créer un cookie crypté et l'ajouter à la
réponse. Le AuthenticationScheme spécifié lors de la configuration doit
également être utilisé lors de l'appel de SignInAsync.Sous les couvertures le cryptage utilisé est ASP.NET's de la Protection des Données
système. Si vous hébergez sur plusieurs machines, l'équilibrage de la charge ou de
à l'aide d'une batterie de serveurs web, alors vous aurez besoin pour configurer la protection des données à
utiliser la même clé de l'anneau et de l'identificateur de l'application.
Donc, est-il possible de décrypter le cookie d'authentification, et si oui, comment?
Mise à JOUR #1:
Basé sur Ron C grande réponse et commentaires, j'ai fini avec le code:
public class Startup
{
//constructor is omitted...
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection().PersistKeysToFileSystem(
new DirectoryInfo(@"C:\temp-keys\"));
services.AddMvc();
}
public void Configure(IApplicationBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
AuthenticationScheme = "MyCookie",
CookieName = "MyCookie",
LoginPath = new PathString("/Home/Index/"),
AccessDeniedPath = new PathString("/Home/AccessDenied/"),
AutomaticAuthenticate = true,
AutomaticChallenge = true
});
app.UseStaticFiles();
app.UseMvcWithDefaultRoute();
}
}
public class HomeController : Controller
{
public async Task<IActionResult> Index()
{
await HttpContext.Authentication.SignInAsync("MyCookie", new ClaimsPrincipal());
return View();
}
public IActionResult DecryptCookie()
{
var provider = DataProtectionProvider.Create(new DirectoryInfo(@"C:\temp-keys\"));
string cookieValue = HttpContext.Request.Cookies["MyCookie"];
var dataProtector = provider.CreateProtector(
typeof(CookieAuthenticationMiddleware).FullName, "MyCookie", "v2");
UTF8Encoding specialUtf8Encoding = new UTF8Encoding(false, true);
byte[] protectedBytes = Base64UrlTextEncoder.Decode(cookieValue);
byte[] plainBytes = dataProtector.Unprotect(protectedBytes);
string plainText = specialUtf8Encoding.GetString(plainBytes);
return Content(plainText);
}
}
Malheureusement, ce code donne toujours des exception sur Unprotect
appel de la méthode:
CryptographicException dans Microsoft.AspNetCore.DataProtection.dll:
Informations supplémentaires: La charge utile était pas valide.
J'ai testé différentes variations de ce code sur plusieurs machines sans résultat positif. Sans doute j'ai fait une erreur, mais où?
Mise à JOUR #2: Mon erreur a été de le DataProtectionProvider
n'a pas été mis en UseCookieAuthentication
. Grâce à @RonC de nouveau.
L'on a accepté la réponse a été donnée par @RonC, pas moi. Son code est correct.
OriginalL'auteur Ilya Chumakov | 2017-03-16
Vous devez vous connecter pour publier un commentaire.
De décrypter le Cookie d'Authentification sans avoir besoin de l'clés
Il est intéressant de noter que vous n'avez pas besoin d'accéder à des clés pour décrypter le cookie d'authentification. Vous avez simplement besoin d'utiliser le droit
IDataProtector
créé avec le droit objectif paramètre, et subpurpose paramètres.Basé sur la
CookieAuthenticationMiddleware
code source https://github.com/aspnet/Security/blob/rel/1.1.1/src/Microsoft.AspNetCore.Authentication.Cookies/CookieAuthenticationMiddleware.cs#L4 il ressemble à la fin vous avez besoin pour réussir esttypeof(CookieAuthenticationMiddleware)
. Et depuis ils sont de passage des paramètres supplémentaires à l'IDataProtector
vous aurez besoin de les faire correspondre. Donc cette ligne de code devrait vous obtenir unIDataProtector
qui peut être utilisée pour décrypter le cookie d'authentification:Noter que
Options.AuthenticationScheme
est juste "Moncookie" dans ce cas, puisque c'est ce qui était mis dans leConfigure
méthode de démarrage.cs fichier.Voici un exemple de méthode d'action pour le décryptage de votre cookie d'authentification de deux façons différentes:
Cette méthode utilise un
IDataProtectionProvider
appeléprovider
qui est constructeur injecté.De décrypter le Cookie d'Authentification lors de la persistance des clés d'un répertoire
Si vous souhaitez partager des cookies entre les applications, alors vous pouvez décider de conserver les données clés de protection d'un répertoire. Cela peut être fait en ajoutant ce qui suit à la
ConfigureServices
méthode de démarrage.cs fichier:ÊTRE PRUDENT bien parce que les touches ne sont pas cryptés, donc c'est à vous de les protéger!!! Seuls persistent les clés d'un répertoire si vous devez absolument, (ou si vous êtes juste essayer de comprendre comment le système fonctionne). Vous aussi besoin de spécifier un cookie
DataProtectionProvider
qui utilise ces touches. Cela peut être fait avec l'aide de laUseCookieAuthentication
de configuration dans leConfigure
méthode de démarrage.cs de la classe comme ceci:Avec cette configuration. Vous pouvez désormais déchiffrer le cookie d'authentification avec le code suivant:
Vous pouvez en apprendre plus sur ce dernier scénario ici: https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/compatibility/cookie-sharing
_
ou-
. Directprotector.Unprotect
appel aussi ne fonctionne pas avec cette chaîne. Avez-vous une idée de comment format la valeur du cookie? CommeCfDJ8Id0LxnC1ZdOqPkWYYQ7uRQKZub1FQoPnSDNwhgiuuJXOUXQYAEMUuYj886KD5vjOFdFEubf_eLlJQU4IZSsO6DNds_FSFCj3wqUTZZEF9BmHMnT40BOrVo03YBH7QGG_XG4EhHl20445H94ywhwGIAefKOhEPqd0m-xpyPFuKwkpPxuMXFl8HKhpI_uoMJJvEalFMOvxfJylTl2kMfmcBW2tgY5J9jjkDgIz-SFUpxZgPcogjTG3hunW-fpgCdLMlGCUKSKTZEYF-hkNCcswGI
Ressemble à la transformé le + et / caractères - " et " _ mais pas nécessairement dans cet ordre. Je vais voir si je peux trouver le code qui le fait.
Ressemble en Core 2.0 le CookieAuthenticationMiddleware classe a été remplacé, mais la valeur de la chaîne "de Microsoft.AspNetCore.L'authentification.Les témoins.CookieAuthenticationMiddleware" est toujours utilisé. github.com/aspnet/Security/blob/...
Je suis toujours avoir des problèmes avec ce travail .NET core 2.0 et un cookie. Des idées? Je suis en concaténant les valeurs des cookies et l'utilisation du nom de cookie dans le DataProtectionProvider. Merci.
Dans le cas où vous avez spécifié un nom d'application lors de l'ajout du service de protection des données
services.AddDataProtection().PersistKeysToFileSystem(new System.IO.DirectoryInfo(@"C:\temp-keys\")).SetApplicationName("MyApplicationName");
assurez-vous de spécifier le même nom dans leDataProtectionProvider.Create
appel:var dataProtection = DataProtectionProvider.Create(new DirectoryInfo(@"C:\temp-keys\"), cfg => cfg.SetApplicationName("MyApplicationName"));
OriginalL'auteur Ron C
Voir ci-dessous une méthode d'assistance pour .NET Core 2 pour obtenir des réclamations à partir d'un cookie:
Comme cela a été signalé par @Cirem, l'épineux chemin de la création d'un protecteur est exactement la façon dont Microsoft n' (voir leur code ici). Par conséquent, il peut changer dans les futures versions.
OriginalL'auteur Alex Klaus