Deseamos compartir contigo la mejor información que hallamos por todo internet. Deseamos que te resulte de utilidad y si quieres comentarnos algo que nos pueda ayudar a crecer siente la libertad de hacerlo..
Solución:
Descifrar la cookie de autenticación sin necesidad de keys
Vale la pena señalar que no necesita obtener acceso a la keys para descifrar la cookie de autenticación. Simplemente necesita usar el derecho IDataProtector
creado con el parámetro de propósito correcto y los parámetros de propósito secundario.
Basado en el CookieAuthenticationMiddleware
código fuente https://github.com/aspnet/Security/blob/rel/1.1.1/src/Microsoft.AspNetCore.Authentication.Cookies/CookieAuthenticationMiddleware.cs#L4 parece que el propósito que debe aprobar es typeof(CookieAuthenticationMiddleware)
. Y dado que están pasando parámetros adicionales al IDataProtector
necesitará hacerlos coincidir. Así que esta línea de código debería darte una IDataProtector
que se puede utilizar para descifrar la cookie de autenticación:
var dataProtector = provider.CreateProtector(typeof(CookieAuthenticationMiddleware).FullName, Options.AuthenticationScheme, "v2");
Tenga en cuenta queOptions.AuthenticationScheme
es solo “MyCookie” en este caso, ya que se configuró en el Configure
método del archivo startup.cs.
A continuación, se muestra un método de acción de ejemplo para descifrar su cookie de autenticación de dos formas diferentes:
public IActionResult DecryptCookie()
//Get the encrypted cookie value
string cookieValue = HttpContext.Request.Cookies["MyCookie"];
//Get a data protector to use with either approach
var dataProtector = provider.CreateProtector(typeof(CookieAuthenticationMiddleware).FullName, "MyCookie", "v2");
//Get the decrypted cookie as plain text
UTF8Encoding specialUtf8Encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true);
byte[] protectedBytes = Base64UrlTextEncoder.Decode(cookieValue);
byte[] plainBytes = dataProtector.Unprotect(protectedBytes);
string plainText = specialUtf8Encoding.GetString(plainBytes);
//Get the decrypted cookie as a Authentication Ticket
TicketDataFormat ticketDataFormat = new TicketDataFormat(dataProtector);
AuthenticationTicket ticket = ticketDataFormat.Unprotect(cookieValue);
return View();
Este método utiliza un IDataProtectionProvider
llamado provider
eso es constructor inyectado.
Descifrar la cookie de autenticación cuando persiste keys a un directorio
Si desea compartir cookies entre aplicaciones, puede optar por mantener la protección de datos. keys a un directorio. Esto se puede hacer agregando lo siguiente a la ConfigureServices
método del archivo startup.cs:
services.AddDataProtection().PersistKeysToFileSystem(
new DirectoryInfo(@"C:temp-keys"));
TEN CUIDADO aunque porque el keys no están encriptados, por lo que depende de usted protegerlos. Solo persiste el keys a un directorio si es absolutamente necesario (o si solo está tratando de comprender cómo funciona el sistema). Vas a además necesita especificar una cookie DataProtectionProvider
que usa esos keys. Esto se puede hacer con la ayuda del UseCookieAuthentication
configuración en el Configure
método de la clase startup.cs así:
app.UseCookieAuthentication(new CookieAuthenticationOptions()
DataProtectionProvider = DataProtectionProvider.Create(new DirectoryInfo(@"C:temp-keys")),
AuthenticationScheme = "MyCookie",
CookieName = "MyCookie",
LoginPath = new PathString("/Home/Login"),
AccessDeniedPath = new PathString("/Home/AccessDenied"),
AutomaticAuthenticate = true,
AutomaticChallenge = true
);
Con esa configuración hecha. Ahora puede descifrar la cookie de autenticación con el siguiente código:
public IActionResult DecryptCookie()
ViewData["Message"] = "This is the decrypt page";
var user = HttpContext.User; //User will be set to the ClaimsPrincipal
//Get the encrypted cookie value
string cookieValue = HttpContext.Request.Cookies["MyCookie"];
var provider = DataProtectionProvider.Create(new DirectoryInfo(@"C:temp-keys"));
//Get a data protector to use with either approach
var dataProtector = provider.CreateProtector(typeof(CookieAuthenticationMiddleware).FullName, "MyCookie", "v2");
//Get the decrypted cookie as plain text
UTF8Encoding specialUtf8Encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true);
byte[] protectedBytes = Base64UrlTextEncoder.Decode(cookieValue);
byte[] plainBytes = dataProtector.Unprotect(protectedBytes);
string plainText = specialUtf8Encoding.GetString(plainBytes);
//Get teh decrypted cookies as a Authentication Ticket
TicketDataFormat ticketDataFormat = new TicketDataFormat(dataProtector);
AuthenticationTicket ticket = ticketDataFormat.Unprotect(cookieValue);
return View();
Puede obtener más información sobre este último escenario aquí: https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/compatibility/cookie-sharing
Vea a continuación un método auxiliar para .NET Core 2 para obtener reclamos de una cookie:
private IEnumerable GetClaimFromCookie(HttpContext httpContext, string cookieName, string cookieSchema)
// Get the encrypted cookie value
var opt = httpContext.RequestServices.GetRequiredService>();
var cookie = opt.CurrentValue.CookieManager.GetRequestCookie(httpContext, cookieName);
// Decrypt if found
if (!string.IsNullOrEmpty(cookie))
var dataProtector = opt.CurrentValue.DataProtectionProvider.CreateProtector("Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware", cookieSchema, "v2");
var ticketDataFormat = new TicketDataFormat(dataProtector);
var ticket = ticketDataFormat.Unprotect(cookie);
return ticket.Principal.Claims;
return null;
Como señaló @Cirem, la forma poco fiable de crear un protector es exactamente cómo lo hace Microsoft (consulte su código aquí). Por lo tanto, puede cambiar en futuras versiones.
Otra variación para ASP.NET Core 2.2:
var cookieManager = new ChunkingCookieManager();
var cookie = cookieManager.GetRequestCookie(HttpContext, ".AspNetCore.Identity.Application");
var dataProtector = dataProtectionProvider.CreateProtector("Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware", "Identity.Application", "v2");
//Get the decrypted cookie as plain text
UTF8Encoding specialUtf8Encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true);
byte[] protectedBytes = Base64UrlTextEncoder.Decode(cookie);
byte[] plainBytes = dataProtector.Unprotect(protectedBytes);
string plainText = specialUtf8Encoding.GetString(plainBytes);
//Get teh decrypted cookies as a Authentication Ticket
TicketDataFormat ticketDataFormat = new TicketDataFormat(dataProtector);
AuthenticationTicket ticket = ticketDataFormat.Unprotect(cookie);
Sección de Reseñas y Valoraciones
Si entiendes que ha resultado útil este artículo, nos gustaría que lo compartas con el resto entusiastas de la programación de esta manera nos ayudas a extender nuestro contenido.