Создание AntiForgeryToken в WebForms
У меня есть сайт .NET Webforms, благодаря которому нужно отправить сообщение в мое приложение MVC, которое в настоящее время находится внутри веб-сайта как отдельное приложение.
Приложению Webform необходимо отправить POST некоторые важные значения в приложение MVC.
Есть ли способ создать AntiForgeryToken() в моем приложении WebForms, чтобы он мог быть передан с сообщением формы.
В противном случае кто-нибудь знает любой другой пользовательский анти-поддельный код, который позволит мне сделать что-то похожее на MVC AntiForgeryValidation.
Ответы
Ответ 1
Реализация этого сама не слишком сложна.
- Создать GUID
- Поместите его в скрытое поле
- Также добавьте его в Session или Cookie (в последнем случае с некоторой защитой от несанкционированного доступа)
- В начале обработки форма сравнивает поле и сохраненный токен.
(Если вы посмотрите на реализацию MVC, это будет очень немного. Несколько вспомогательных методов - это все, что вам нужно.)
Ответ 2
Это старый вопрос, но последний шаблон ASP.NET для Visual Studio 2012 для веб-форм включает в себя анти-код 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
Ответ 3
Версия С# для Ian Ippolito здесь:
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)
{
}
}
Ответ 4
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.
Ответ 5
Вы можете использовать отражение, чтобы получить методы MVC, используемые для установки файла cookie и ввода формы формы, используемого для проверки MVC. Таким образом, вы можете иметь MVC-действие с атрибутами [AcceptVerbs(HttpVerbs.Post), ValidateAntiForgeryToken]
, которые вы можете публиковать на странице сгенерированной WebForms.
Смотрите этот ответ: Использование MVC HtmlHelper из WebForm