none
Prevenir ataque CSRF C# webform RRS feed

Respuestas

  • Esto es lo que me sale al crear un nuevo proyecto web en Visual Studio 2015. No tengo a mano un 2017 para probarlo.

        public partial class SiteMaster : MasterPage
        {
            private const string AntiXsrfTokenKey = "__AntiXsrfToken";
            private const string AntiXsrfUserNameKey = "__AntiXsrfUserName";
            private string _antiXsrfTokenValue;
    
            protected void Page_Init(object sender, EventArgs e)
            {
                // The code below helps to protect against XSRF attacks
                var requestCookie = Request.Cookies[AntiXsrfTokenKey];
                Guid requestCookieGuidValue;
                if (requestCookie != null && Guid.TryParse(requestCookie.Value, out requestCookieGuidValue))
                {
                    // Use the Anti-XSRF token from the cookie
                    _antiXsrfTokenValue = requestCookie.Value;
                    Page.ViewStateUserKey = _antiXsrfTokenValue;
                }
                else
                {
                    // Generate a new Anti-XSRF token and save to the cookie
                    _antiXsrfTokenValue = Guid.NewGuid().ToString("N");
                    Page.ViewStateUserKey = _antiXsrfTokenValue;
    
                    var responseCookie = new HttpCookie(AntiXsrfTokenKey)
                    {
                        HttpOnly = true,
                        Value = _antiXsrfTokenValue
                    };
                    if (FormsAuthentication.RequireSSL && Request.IsSecureConnection)
                    {
                        responseCookie.Secure = true;
                    }
                    Response.Cookies.Set(responseCookie);
                }
    
                Page.PreLoad += master_Page_PreLoad;
            }
    
            protected void master_Page_PreLoad(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    // Set Anti-XSRF token
                    ViewState[AntiXsrfTokenKey] = Page.ViewStateUserKey;
                    ViewState[AntiXsrfUserNameKey] = Context.User.Identity.Name ?? String.Empty;
                }
                else
                {
                    // Validate the Anti-XSRF token
                    if ((string)ViewState[AntiXsrfTokenKey] != _antiXsrfTokenValue
                        || (string)ViewState[AntiXsrfUserNameKey] != (Context.User.Identity.Name ?? String.Empty))
                    {
                        throw new InvalidOperationException("Validation of Anti-XSRF token failed.");
                    }
                }
            }
    
            protected void Page_Load(object sender, EventArgs e)
            {
    
            }
    
            protected void Unnamed_LoggingOut(object sender, LoginCancelEventArgs e)
            {
                Context.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
            }
        }
    

    • Marcado como respuesta Nestor Vitozzi lunes, 26 de agosto de 2019 11:49
    domingo, 25 de agosto de 2019 15:38

Todas las respuestas

  • En principio esto ocurre automáticamente si estás creando un nuevo proyecto web con una versión relativamente reciente de Visual Studio (creo que a partir del 2013; con el 2015, seguro) y usas Master Page.

    Abre el .cs de la Site.Master, y verás cómo en el Page_Init tiene ya metido el código que genera la cookie para el anti-forgery, y en el Page_Pre_Load la controla contra un campo hidden (concretamente guarda el valor dentro del ViewState).

    Así que no tienes que hacer nada, ya viene hecho "de fábrica" si estás usando la Masterpage predeterminada  contra una aplicación generada nueva.

    domingo, 25 de agosto de 2019 5:45
  • Hola, estoy usando Visual Studio Community 2017 y cuando creo una masterpage, en el cs "arranca" de esta manera

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;

    namespace MutualASP
    {
        public partial class SiteMaster : MasterPage
        {
            protected void Page_Load(object sender, EventArgs e)
            {

            }
        }
    }

    No veo en ningun lado veo lo que estas diciendo Alberto, podes pasarme un ejemplo, o detallarme un poco mas

    Gracias

    domingo, 25 de agosto de 2019 15:17
  • Esto es lo que me sale al crear un nuevo proyecto web en Visual Studio 2015. No tengo a mano un 2017 para probarlo.

        public partial class SiteMaster : MasterPage
        {
            private const string AntiXsrfTokenKey = "__AntiXsrfToken";
            private const string AntiXsrfUserNameKey = "__AntiXsrfUserName";
            private string _antiXsrfTokenValue;
    
            protected void Page_Init(object sender, EventArgs e)
            {
                // The code below helps to protect against XSRF attacks
                var requestCookie = Request.Cookies[AntiXsrfTokenKey];
                Guid requestCookieGuidValue;
                if (requestCookie != null && Guid.TryParse(requestCookie.Value, out requestCookieGuidValue))
                {
                    // Use the Anti-XSRF token from the cookie
                    _antiXsrfTokenValue = requestCookie.Value;
                    Page.ViewStateUserKey = _antiXsrfTokenValue;
                }
                else
                {
                    // Generate a new Anti-XSRF token and save to the cookie
                    _antiXsrfTokenValue = Guid.NewGuid().ToString("N");
                    Page.ViewStateUserKey = _antiXsrfTokenValue;
    
                    var responseCookie = new HttpCookie(AntiXsrfTokenKey)
                    {
                        HttpOnly = true,
                        Value = _antiXsrfTokenValue
                    };
                    if (FormsAuthentication.RequireSSL && Request.IsSecureConnection)
                    {
                        responseCookie.Secure = true;
                    }
                    Response.Cookies.Set(responseCookie);
                }
    
                Page.PreLoad += master_Page_PreLoad;
            }
    
            protected void master_Page_PreLoad(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    // Set Anti-XSRF token
                    ViewState[AntiXsrfTokenKey] = Page.ViewStateUserKey;
                    ViewState[AntiXsrfUserNameKey] = Context.User.Identity.Name ?? String.Empty;
                }
                else
                {
                    // Validate the Anti-XSRF token
                    if ((string)ViewState[AntiXsrfTokenKey] != _antiXsrfTokenValue
                        || (string)ViewState[AntiXsrfUserNameKey] != (Context.User.Identity.Name ?? String.Empty))
                    {
                        throw new InvalidOperationException("Validation of Anti-XSRF token failed.");
                    }
                }
            }
    
            protected void Page_Load(object sender, EventArgs e)
            {
    
            }
    
            protected void Unnamed_LoggingOut(object sender, LoginCancelEventArgs e)
            {
                Context.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
            }
        }
    

    • Marcado como respuesta Nestor Vitozzi lunes, 26 de agosto de 2019 11:49
    domingo, 25 de agosto de 2019 15:38
  • Alberto, tengo a mano un visual studio 2015 y se comporta igual que el tuyo, o sea que genera automaticamente el anti-forgery.

    NO asi el Visual Studio 2017.

    Pero bueno, copiare lo que me tira el VS 2015 en el VS 2017, deberia funcionar igual

    Gracias por tu ayuda 

    domingo, 25 de agosto de 2019 16:06
  • Alberto, cuando traslado el codigo de la masterpage desde vs 2015 a 2017, me queda todo bien menos esto

    protected void Unnamed_LoggingOut(object sender, LoginCancelEventArgs e)
     {
                Context.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
     }

    me da error en GetOwinContext(), no esta ese metodo o definicion en el entorno de VS2017, la consulta es:

     Esta rutina es realmente importante para lo que busco que seria el Anti-Forgery?

    Si es importante, como puedo reemplazarla o hacerla compatible con vs 2017

    domingo, 25 de agosto de 2019 16:42
  • No, eso no tienes que trasladarlo. No tiene nada que ver con el CSRF, está relacionado con el login, que presumiblemente usa un mecanismo distinto en el 2007.
    lunes, 26 de agosto de 2019 6:50
  • Gracias alberto por tu ayuda
    lunes, 26 de agosto de 2019 11:49