Создание AntiForgeryToken в WebForms - PullRequest
       26

Создание AntiForgeryToken в WebForms

18 голосов
/ 24 августа 2009

У меня есть сайт .NET Webforms, спасибо за необходимость опубликовать мое приложение MVC, которое в настоящее время находится внутри сайта Webform, как отдельное приложение.

Приложению Webform необходимо отправить некоторые конфиденциальные значения в приложение MVC.

Есть ли способ сгенерировать AntiForgeryToken () в моем приложении WebForms, чтобы его можно было передать вместе с формой post.

В противном случае кто-нибудь знает какой-либо другой специальный код для защиты от подделки, который позволит мне сделать нечто похожее на MVC AntiForgeryValidation.

Ответы [ 5 ]

9 голосов
/ 05 июня 2013

Это старый вопрос, но последний шаблон Visual Studio 2012 ASP.NET для веб-форм включает анти-CSRF-код, запеченный на главной странице. Если у вас нет шаблонов, вот код, который он генерирует:

Protected Sub Page_Init(sender As Object, e As System.EventArgs)


    ' The code below helps to protect against XSRF attacks
    Dim requestCookie As HttpCookie = Request.Cookies(AntiXsrfTokenKey)
    Dim requestCookieGuidValue As Guid
    If ((Not requestCookie Is Nothing) AndAlso Guid.TryParse(requestCookie.Value, requestCookieGuidValue)) Then
        ' 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

        Dim responseCookie As HttpCookie = New HttpCookie(AntiXsrfTokenKey) With {.HttpOnly = True, .Value = _antiXsrfTokenValue}
        If (FormsAuthentication.RequireSSL And Request.IsSecureConnection) Then
            responseCookie.Secure = True
        End If
        Response.Cookies.Set(responseCookie)
    End If

    AddHandler Page.PreLoad, AddressOf master_Page_PreLoad
End Sub

Private Sub master_Page_PreLoad(sender As Object, e As System.EventArgs)


    If (Not IsPostBack) Then
        ' Set Anti-XSRF token
        ViewState(AntiXsrfTokenKey) = Page.ViewStateUserKey
        ViewState(AntiXsrfUserNameKey) = If(Context.User.Identity.Name, String.Empty)
    Else
        ' Validate the Anti-XSRF token
        If (Not DirectCast(ViewState(AntiXsrfTokenKey), String) = _antiXsrfTokenValue _
            Or Not DirectCast(ViewState(AntiXsrfUserNameKey), String) = If(Context.User.Identity.Name, String.Empty)) Then
            Throw New InvalidOperationException("Validation of Anti-XSRF token failed.")
        End If
    End If
End Sub
9 голосов
/ 24 августа 2009

Осуществить это самостоятельно не так уж сложно.

  • Создать GUID
  • Поместите это в скрытое поле
  • Также поместите его в Session или Cookie (в последнем случае, с некоторой защитой от взлома)
  • В начале обработки формы сравнивают поле и сохраненный токен.

(Если вы посмотрите на реализацию MVC, то тут совсем немного больше. Несколько вспомогательных методов - все, что вам нужно.)

5 голосов
/ 06 мая 2016

Ответ Яна Ипполито на C # здесь:

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)
    {

    }
}
3 голосов
/ 26 февраля 2010

WebForms имеет очень похожий аналог в Page.ViewStateUserKey . Если установить для каждого пользователя значение (большинство выбирают HttpSessionState.SessionId ), WebForms будет проверять ViewState 1 как часть проверки MAC .

 overrides OnInit(EventArgs e) {
     base.OnInit(e);
     ViewStateUserKey = Session.SessionId;
 }

1 Существуют сценарии, в которых ViewStateUserKey не поможет . В основном они сводятся к выполнению опасных действий с GET-запросами (или в Page_Load без проверки IsPostback) или отключению ViewStateMAC.

1 голос
/ 01 апреля 2010

Вы можете использовать отражение, чтобы получить методы MVC, используемые для установки файла cookie, и формы ввода, используемые для проверки MVC. Таким образом, вы можете иметь действие MVC с [AcceptVerbs(HttpVerbs.Post), ValidateAntiForgeryToken] атрибутами, которые вы можете публиковать на странице, сгенерированной WebForms.

См. Этот ответ: Использование MVC HtmlHelper из WebForm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...