Pregunta

Yo sé cómo utilizar el atributo AntiForgeryToken de MVC y está asociado ayudante HTML para ayudar a XSRF-obtener puestos de forma de mi aplicación.

¿Puede algo similar se puede hacer para JsonResults que implementan GET?

Por ejemplo, mi vista contiene una llamada jQuery onSubmit como por ejemplo:

$.getJSON("/allowActivity/YesOrNo/" + someFormValue, "{}", function(data) {
  if(data.Allow) {
    //Do something.
  }
});

Quiero para asegurarse de que esta JsonResult sólo es exigible a partir de la página deseada.

EDIT:

encontré este post sobre una pregunta similar, sin una respuesta concreta.

¿Cuál es la forma más fácil de asegurarse de que mi GET (no destructivo) URL sólo se consume por una llamada AJAX de mi propia página?

¿Fue útil?

Solución

Puede utilizar el AntiForgeryToken combinado con un poco de lógica personalizada. La creación de la ficha AntiForgery en el servidor es el mismo, pero por defecto, el valor no está incluido en su XmlHttpRequest.

El valor de este elemento está en el HTTP única cookie "__RequestVerificationToken" y también debe estar en los datos del formulario enviado al servidor. Así incluir un par clave / valor en su XmlHttpRequest y utilizar el ValidateAntiForgeryToken - atributo en el controlador

EDIT:

Hoy he intentado usar el AntiForgeryToken para Ajax pide a mí mismo y funciona bien. Sólo tiene que utilizar el siguiente javascript:

$.post('my_url',  $.getAntiForgeryTokenString(), function() { ... });

$.getAntiForgeryTokenString = function() {
    return $(document.getElementsByName("__RequestVerificationToken")).fieldSerialize();
};

En el lado del servidor que no tiene que cambiar su código -. Sólo tiene que utilizar el atributo ValidateAntiForgeryToken- para su acción

Espero que esto ayude

Otros consejos

En primer lugar ¿por qué no usar $ .post (url, de datos, de devolución de llamada, 'json') en lugar de getJSON? Y como dijo kleolb02, es posible agregar valor de la cookie a los datos de envío utilizando galletas complemento - {__RequestVerificationToken: $ .cookie ( '__ RequestVerificationToken')}

He utilizado un código similar en un proyecto ASP.NET MVC para utilizar en función de toma de un elemento sin tener una forma Ajax. Este código proporciona llenar un campo de texto con los datos del servidor cuando se produce un evento determinado HTML elemento Blur.

Espero que esto ayude también. Aquí está mi código:

Javascript:

var mytext = { 'myText': 'example text' };
$.post('/MyController/JsonResultMethod', AddAntiForgeryToken(myText), function (resultData) {
        $('#htmlElement').val(resultData);
});
AddAntiForgeryToken = function (data) {
    data.__RequestVerificationToken = $('input[name=__RequestVerificationToken]').val();
    return data;
};

código C-Sharp:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public JsonResult SeoString(string myText)
    {
        try
        {
            // do something here
            return this.Json("result text");
        }
        catch (Exception)
        { return this.Json(string.Empty); }
    }

Puede hacer algo similar a los métodos de lucha contra XSRF. Simplemente generar algo de Identificación insertarlo en el código JavaScript y cuando el usuario llama a su URL JSON, que tiene URL incluye el ID generado y comprobar si está allí.

Una defensa contra XSRF también está utilizando el Id.sesión como clave, esto no impide que el usuario que está ejecutando desde otro sitio web por su propia cuenta sin embargo.

Algunos hash a partir de la sesión y el tiempo puede hacer el truco. Por supuesto, si el usuario copia el valor de la JS, que todavía puede ejecutarlo desde otro lugar, pero se puede tener ese valor expire cada x minutos. Otra opción es establecer una cookie con JS y leerlo serverside.

Espero que esto te da algunas ideas para empezar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top