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:

Comment déchiffrer manuellement un ASP.NET Core cookie d'Authentification?

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.

pourriez-vous mettre à jour votre réponse avec un code correct?
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