Manuelles entschlüsseln einer ASP.NET Core-Authentifizierungs-cookie?

Betrachten wir einen gemeinsamen bekannten ASP.NET Core-Szenario. Zunächst fügen wir die 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
    });
    //...
}

Dann serialisieren eines Auftraggebers:

await HttpContext.Authentication.SignInAsync("MyCookie", principal);

Nachdem diese beiden Aufrufe wird ein verschlüsseltes cookie gespeichert wird auf der client-Seite. Sie können sehen, das cookie (in meinem Fall war es chunked) in einem browser-devtools:

Manuelles entschlüsseln einer ASP.NET Core-Authentifizierungs-cookie?

Ist es kein problem (und keine Frage), um cookies von Anwendungs-code.

Meine Frage ist: wie zum entschlüsseln des Cookies außerhalb der Anwendung? Ich denke, ein privater Schlüssel benötigt, der, wie um es zu bekommen?

Überprüfte ich die docs und fand nur gebräuchliche Wörter:

Dadurch wird ein verschlüsseltes cookie und fügt es der aktuellen
Antwort. Die AuthenticationScheme während der Konfiguration angegeben haben müssen
auch beim Aufruf SignInAsync.

Unter der Decke der Verschlüsselung verwendet wird ASP.NET's Datenschutz
system. Wenn Sie hosting auf mehreren Maschinen, load balancing oder
mit einer web-farm, dann müssen Sie konfigurieren, Datenschutz
verwenden Sie den gleichen Schlüssel ring-und application identifier.

So, ist es möglich, zu entschlüsseln, die das Authentifizierungs-cookie, und wenn ja, wie?

UPDATE #1:
Basierend auf Ron C tolle Antwort und Kommentare, ich habe endete mit 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);
    }
}

Leider ist dieser code erzeugt immer Ausnahme auf Unprotect Aufruf der Methode:

CryptographicException in Microsoft.AspNetCore.DataProtection.dll:
Zusätzliche Informationen: Die Nutzlast war ungültig.

Getestet habe ich verschiedene Variationen dieser code auf mehreren Maschinen ohne positives Ergebnis. Wahrscheinlich machte ich einen Fehler, aber wo?

UPDATE #2: Mein Fehler war, den DataProtectionProvider wurde noch nicht festgelegt in UseCookieAuthentication. Dank @RonC wieder.

  • könnte Sie aktualisieren Sie Ihre Antwort mit dem richtigen code?
  • Die akzeptierte Antwort wurde gegeben durch @RonC, nicht mich. Sein code richtig ist.
Schreibe einen Kommentar