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:
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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entschlüsselung der Authentifizierungs-Cookie, ohne die Tasten
Es ist erwähnenswert, dass Sie nicht brauchen, um Zugang zum Schlüssel zu entschlüsseln, die das Authentifizierungs-cookie. Sie müssen einfach nur die richtigen
IDataProtector
erstellt mit den richtigen Zweck parameter, und subpurpose Parameter.Basiert auf der
CookieAuthenticationMiddleware
Quellcode https://github.com/aspnet/Security/blob/rel/1.1.1/src/Microsoft.AspNetCore.Authentication.Cookies/CookieAuthenticationMiddleware.cs#L4 es sieht aus wie der Zweck, die Sie übergeben müssen, isttypeof(CookieAuthenticationMiddleware)
. Und da Sie die übergabe von zusätzlichen Parametern an dieIDataProtector
Sie müssen zu Ihnen passen. Also diese code-Zeile sollte Euch einIDataProtector
verwendet werden können, zu entschlüsseln, die das Authentifizierungs-cookie:Beachten Sie, dass
Options.AuthenticationScheme
nur "MyCookie" in diesem Fall, da das ist, was es war in derConfigure
Methode der Inbetriebnahme.cs-Datei.Hier ist ein Beispiel action-Methode für die Entschlüsselung der Authentifizierungs-cookie, der zwei verschiedene Wege:
Diese Methode verwendet eine
IDataProtectionProvider
genanntprovider
ist Konstruktor injiziert.Entschlüsselung der Authentifizierungs-Cookie, wenn anhaltende Schlüssel zu einem Verzeichnis
Wenn Sie möchten, teilen Sie cookies zwischen den Anwendungen dann können Sie sich entscheiden, bestehen die Datenschutz-Tasten in ein Verzeichnis. Dies kann durch hinzufügen des folgenden in die
ConfigureServices
Methode der Inbetriebnahme.cs-Datei:VORSICHTIG SEIN zwar, weil die Schlüssel nicht verschlüsselt sind, so ist es bis zu Ihnen, um Sie zu schützen!!! Nur bestehen die Schlüssel zu einem Verzeichnis, wenn Sie absolut müssen, (oder wenn Sie nur versuchen, zu verstehen, wie das system funktioniert). Sie auch angeben müssen, ein cookie
DataProtectionProvider
verwendet diese Schlüssel. Diese kann getan werden, mit Hilfe derUseCookieAuthentication
Konfiguration in derConfigure
Methode der Inbetriebnahme.cs-Klasse in etwa so:Mit dieser Konfiguration durchgeführt. Jetzt können Sie entschlüsseln das Authentifizierungs-cookie mit dem folgenden code:
Erfahren Sie mehr über dieses letztere Szenario hier: https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/compatibility/cookie-sharing
_
oder-
. Direkteprotector.Unprotect
aufrufen auch nicht funktioniert mit string. Haben Sie keine Idee, wie formatieren Sie den cookie-Wert? WieCfDJ8Id0LxnC1ZdOqPkWYYQ7uRQKZub1FQoPnSDNwhgiuuJXOUXQYAEMUuYj886KD5vjOFdFEubf_eLlJQU4IZSsO6DNds_FSFCj3wqUTZZEF9BmHMnT40BOrVo03YBH7QGG_XG4EhHl20445H94ywhwGIAefKOhEPqd0m-xpyPFuKwkpPxuMXFl8HKhpI_uoMJJvEalFMOvxfJylTl2kMfmcBW2tgY5J9jjkDgIz-SFUpxZgPcogjTG3hunW-fpgCdLMlGCUKSKTZEYF-hkNCcswGI
protector.Unprotect(Base64UrlTextEncoder.Decode(cookieValue));
wirftCryptographicException in Microsoft.AspNetCore.DataProtection.dll: Additional information: The payload was invalid.
ich habe versucht, die neu-Taste und rufen SieUnprotect
innerhalb des gleichen Prozesses, die das cookie erstellt aber ohne Erfolg.The payload was invalid
Nachricht die ganze Zeit. Rufen Sieservices.AddDataProtection().PersistKeysToFileSystem(someDir)
imStartup.ConfigureServices
? Gib mir etwas Zeit, ich werde überprüfen Sie den code unter unterschiedlichen Umwelt.AuthenticationScheme
in IhremCookieAuthenticationOptions
im Autostart.cs-Klasse MUSS mit dem ÜBEREINSTIMMEN, was Sie übergeben, die CreateProtector Methode. In diesem Fall ist 'MyCookieMiddlewareInstance'. Wenn Sie unterschiedlich sind, das ist ein Weg, um den Fehler zu sehen sind.Configure
Methode.DataProtectionProvider
imUseCookieAuthentication
ist das Problem behoben. Tausend mal danke.services.AddDataProtection().PersistKeysToFileSystem(new System.IO.DirectoryInfo(@"C:\temp-keys\")).SetApplicationName("MyApplicationName");
sicher, dass Sie den gleichen Namen in derDataProtectionProvider.Create
nennen:var dataProtection = DataProtectionProvider.Create(new DirectoryInfo(@"C:\temp-keys\"), cfg => cfg.SetApplicationName("MyApplicationName"));
Identity.Application
(im Beispiel oben ist es umbenannt inMyCookie
). So, die Erstellung des Protektors sieht aus wiedataProtectionProvider.CreateProtector("Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware","Identity.Application", "v2")
zu vermeidenThe payload was invalid.
Ausnahme. Ich verbringe eine Menge Zeit mit dem Versuch zu finden, Standardwert und entschlüsseln meine cookies.Unten finden Sie eine helper-Methode für .NET Core 2 um Ansprüche aus einem cookie:
Als wurde darauf von @Cirem, die fragwürdige Möglichkeit zu schaffen, ein Beschützer ist, genau wie Microsoft es tut (siehe Ihr code hier). Daher kann es in zukünftigen Versionen ändern.
Andere Variante für ASP.NET Core 2.2: