2012-07-03 15 views
8

Estoy utilizando el método de ayuda AntiForgeryToken. Por lo que entiendo acerca de AntiForgeryToken es que es una base de sesión, de modo que cada usuario tiene el mismo token pero otro usuario tendrá un token diferente (siempre que use las mismas sales para todos los formularios). Mi "problema" es que AntiForgeryToken está generando tokens diferentes para el mismo usuario con la misma sal. Por ejemplo ...AntiForgeryToken cambios por solicitud

Contoller

public ActionResult Test() 
{ 
    return View(); 
} 

Ver

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken("Salty!") 
} 

Salida Solicitud # 1

<input name="__RequestVerificationToken" type="hidden" value="K1sijFuYvyGUJjGg33OnLjJaU3tFpGFDutRt9TOFSkZ6FcrhJMMQPnOqjIHuTwBXs/sPBXEiE+1qyV9l63nnSO161b+OtLbaBoPC7K3/7wxtnuSY+N0o/fqBgVoDyac4dNVp+OvanKBSrHINKfc3WEg9269BHOJNzFowC6Aeac/afAGTGrBypxUHfqrKVowD" /> 

salida Petición # 2

<input name="__RequestVerificationToken" type="hidden" value="mOpP6LMQXnCmjr5/Wdtnhguh3PyZxWj7GWf8LYzZXPKcJBBT+DbAHvynquSD65O0DBw1RKR7DxCNg372ukftCOWms+o75CraMyFMnvjGk7RU+znIQm05eRQvr5H6d/MDyn+0DWm3jLnMBM9GplsgMRqbdAHzSe69/cS2x9A4X/9jFTZQHUWXXHUr0xewF8Rk" /> 

Las claves son diferentes para la misma sesión con la misma sal. ¿Tengo un malentendido fundamental de la protección CRSF? ¿O es esta una nueva característica?

Respuesta

5

El token anti XSRF funciona cifrando el mismo valor aleatorio en una cookie de sesión y en su formulario. Las cookies de sesión se envían solo cuando realiza una publicación desde el formulario que ha generado.

Este enfoque también funciona, p. en granjas de servidores (en un escenario de equilibrio de carga) donde todos los servidores comparten la clave de cifrado. La validación solo funciona al comparar el valor descifrado de los datos del formulario publicado y el valor descifrado de la cookie de sesión publicada. Esto se llama el método double submitted cookie.

Por lo tanto, es bastante normal que cada solicitud tenga un valor diferente. This is a nice post sobre tokens ASP.NET MVC XSRF.

+0

¿Cambia los datos de sesión en el servidor cuando se emite un nuevo token? Todos los valores de mis cookies permanecen igual. Pensé que el valor de la cookie __RequestVerificationToken_Lw__ cambiaría. –

+0

No, el servidor establece la cookie en el cliente. El cliente luego envía el mismo valor dos veces al publicar. Una vez codificado en los datos del formulario y una vez en la cookie (las cookies se transfieren al servidor en POST). El servidor solo conoce la clave de cifrado. No almacena nada más para fines anti XSRF. – m0sa

+0

¿Alguna razón para no almacenar los tokens en sesión y nunca enviarlos al cliente? Algo así como: AntiForgery.GetTokens (null, out cookieToken, out formToken); return cookieToken + ":" + formToken; ¿Entonces solo almacena eso en sesión? –

Cuestiones relacionadas