Saltar al contenido

¿Cómo descifrar manualmente una cookie de autenticación de ASP.NET Core?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *