2011-11-09 17 views
5

Tenemos un sitio web que usa MVC3 y un método de autenticación personalizado que no depende en absoluto de la autenticación de formularios, al menos por lo que puedo decir. En web.config configuramosAntiForgeryToken sin autenticación de formularios

<authentication mode="None"></authentication> 

y nunca usamos/configuramos HttpContext.User en ningún lugar del código. El problema es cuando se usa @ Html.AntiForgeryToken() en algunos casos, el usuario recibe este mensaje de error:

A required anti-forgery token was not supplied or was invalid 

Centralizamos todas las comprobaciones de lucha contra la falsificación en OnAuthorization con este código:

if (String.Compare(filterContext.HttpContext.Request.HttpMethod, "post", true) == 0) 
{ 
    var forgery = new ValidateAntiForgeryTokenAttribute(); 
    forgery.OnAuthorization(filterContext); 
} 

Eso es donde ocurre la excepción Tenemos defined a machineKey in web.config para evitar que se generen nuevas claves cuando el grupo de aplicaciones se recicla. Esto no solucionó el problema.

Luego pensamos que tal vez el navegador del cliente no está enviando cookies. Comenzamos a registrar cookies y notamos que, en algunos casos, se envía la cookie RequestVerificationToken_Lw, pero en otros no, a pesar de que otras cookies, como las hechas por Google Analytics, se envían correctamente. ¿Podría ser algo en el navegador que está eliminando algunas cookies y dejando otras?

Parece que el anti-forgery token depends on forms authentication. ¿Es este el caso? Cualquier forma de seguir utilizando AntiForgeryToken cuando no se utiliza la autenticación de formularios de manera confiable. Tenga en cuenta que el método que describí anteriormente funciona en más del 90% de los casos, pero no podemos precisar por qué no funciona para algunas personas.

¿Pensamientos?
Gracias!

+0

¿Por qué preocuparse por los tokens de falsificación si no está utilizando ninguna autenticación? El objetivo de un ataque CSRF es que un atacante realice acciones en nombre de un usuario autenticado en un sitio. Y si un sitio no usa autenticación, CSRF parece no tener sentido. –

+0

Estoy utilizando la autenticación, pero no la autenticación de formularios. – pbz

+0

qué tipo de autenticación estás usando? –

Respuesta

0

¿Algunos usuarios tienen este problema todo el tiempo? ¿O solo parte del tiempo? Además, ¿funciona para algunos de los métodos TODO el tiempo o es inconsistente para el mismo método de acción? ¿Tienes alguna llamada ajax? La implementación del token anti falsificación por defecto no maneja las llamadas AJAX. Pero puede escribir un código personalizado para que funcione

+0

no sé por qué eso apareció como una respuesta y no un comentario –

+0

Gracias por su respuesta! 1) Algunos usuarios parecen tenerlo todo el tiempo, pero el único usuario con el que tuve contacto no es técnico, así que no pude investigar demasiado. Veo su IP y error en el registro, así que sé que es legítimo. 2) No hay llamadas AJAX en esas páginas. Soy consciente de esas limitaciones y he trabajado donde sea necesario. – pbz

0

¿Está agregando el token antiforgery dentro del formulario? El token antiforgery se almacena en el cliente a través de un elemento HTML oculto y no como una cookie. La otra pregunta sería ¿qué versión de navegador están usando? ¿Puede la actualización a la última?

@using (Html.BeginForm()) 
    { 
     @Html.AntiForgeryToken()... 
+0

Sí, estoy incluyendo el token dentro del formulario. No sé qué versión están usando, pero están usando Internet Explorer (de acuerdo con la única persona a la que pude contactar). Esto le ha sucedido a otras personas, pero desafortunadamente no logré registrar la versión del navegador.Es posible que deba volver atrás y registrar tanto como pueda para obtener más datos. Esperaba que otros encontraran este problema antes. – pbz

Cuestiones relacionadas