2013-10-09 3 views
0

Мы используем новый шаблон веб-форм ASP.NET в новом VS 2012. Поскольку у нас были некоторые проблемы с IIS с этой ошибкой:Отключение проверки токена Анти-XSRF в веб-формах ASP.NET перенаправляется на страницу входа в IIS и IE

«System.Web.HttpException (0x80004005): не удалось выполнить проверку MAC-адреса viewstate. Если это приложение размещено веб-фермой или кластером, убедитесь, что конфигурация задает тот же алгоритм validationKey и валидации. AutoGenerate не может использоваться в кластере . ---> System.Web.UI.ViewStateException: недопустимое состояние просмотра. "

Тогда мы сделали это изменения в web.config:

<pages validateRequest="false" enableEventValidation="false" viewStateEncryptionMode ="Never" enableViewStateMac="false" > ... </pages> 

, но тогда мы получили ошибку: "Validation анти-XSRF знак не удалось."

Мы прокомментировали весь код на сайте Site.Master.cs, касающийся проверки маркера Анти-XSRF (поскольку сайт используется в интрасети), однако теперь мы не можем войти в систему с помощью IE (в Chrome и Firefox работает), потому что после входа в систему (который является успешным в журнале), он перенаправляет на страницу входа в систему снова, но пользователь вошел в систему

UPDATE Я пытался все решения здесь и он не работает:. http://blogs.msdn.com/b/tom/archive/2008/03/14/validation-of-viewstate-mac-failed-error.aspx. Наконец, я также попробовал: в web.config, но потом я получил ошибку: System.InvalidOperationException: проверка недействительности маркера Anti-XSRF не удалась. Тем не менее, решения нет.

UPDATE 2 Есть правильный способ отключить Anti-XSRF маркер проверки в новом веб-форм ASP.NET шаблон проекта?

ответ

2

Вместо того, чтобы дезактивировать все функции безопасности ASP.NET (которые НЕ рекомендуются вообще), вы должны сосредоточиться на решении фактической ошибки.

System.Web.HttpException (0x80004005): Validation of viewstate MAC failed - распространенная ошибка. Чтобы решить эту проблему, вы должны определить machinekey для использования в файле web.config. Обычно это связано с тем, что у вас есть два разных ключа для обратной передачи. Определение в web.config, скорее всего, решит проблему (не забудьте повторно активировать функции безопасности, такие как шифрование в представлении). Вы можете сгенерировать здесь: http://aspnetresources.com/tools/machineKey

Посмотреть этот пост для примера: https://stackoverflow.com/a/6260201/375304 (но не используйте тот же ключ).

Кроме того, посмотрите на эту ссылку, возможно, было бы полезно понять функции безопасности ASP.NET, связанные с машинным ключом. http://msdn.microsoft.com/en-us/library/ff649308.aspx

UPDATE: Если какой-либо из этого не работает, попробуйте следующее (source):

Another solution based on #3 above, special thanks to Alex for posting this in the comments below. He wrote a small class called BasePage that fixes the issues, so you just have to extend your page from BasePage instead of Page:

public class BasePage : Page 
{ 
    private static string[] aspNetFormElements = new string[] 
    { 
    "__EVENTTARGET", 
    "__EVENTARGUMENT", 
    "__VIEWSTATE", 
    "__EVENTVALIDATION", 
    "__VIEWSTATEENCRYPTED", 
    }; 

    protected override void Render(HtmlTextWriter writer) 
    { 
    StringWriter stringWriter = new StringWriter(); 
    HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter); 
    base.Render(htmlWriter); 
    string html = stringWriter.ToString(); 
    int formStart = html.IndexOf("<form"); 
    int endForm = -1; 
    if (formStart >= 0) 
     endForm = html.IndexOf(">", formStart); 

    if (endForm >= 0) 
    { 
     StringBuilder viewStateBuilder = new StringBuilder(); 
     foreach (string element in aspNetFormElements) 
     { 
     int startPoint = html.IndexOf("<input type=\"hidden\" name=\"" + element + "\""); 
     if (startPoint >= 0 && startPoint > endForm) 
     { 
      int endPoint = html.IndexOf("/>", startPoint); 
      if (endPoint >= 0) 
      { 
      endPoint += 2; 
      string viewStateInput = html.Substring(startPoint, endPoint - startPoint); 
      html = html.Remove(startPoint, endPoint - startPoint); 
      viewStateBuilder.Append(viewStateInput).Append("\r\n"); 
      } 
     } 
     } 

     if (viewStateBuilder.Length > 0) 
     { 
     viewStateBuilder.Insert(0, "\r\n"); 
     html = html.Insert(endForm + 1, viewStateBuilder.ToString()); 
     } 
    } 

    writer.Write(html); 
    } 
} 
+0

Что касается первой ошибки ("Проверка ViewState MAC не удалось"), мы все пробовал и терпел неудачу. Конечно, мы пытались определить machinekey в web.config, на самом деле он генерируется с помощью нового проекта, но он не работает. – Milan

+0

Ну, тогда вы должны просмотреть свой код и посмотреть, нет ли каких-либо изменений в представлении в POST. Но я по-прежнему настоятельно рекомендую вам решить проблему проверки MAC, а не проблему входа/перенаправления. – CharlesAD

+0

Я вернул все в состояние по умолчанию, и теперь я получаю ту же ошибку в IIS: «Не удалось выполнить проверку MAC-адреса viewstate.» Client IP: 192.168.80.156 \t Порт: 7401 \t Referer: HTTP: //app_server/myapp/Account/Login.aspx ReturnUrl =% 2fmyapp \t Путь: /myapp/Account/Login.aspx \t User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; с.в.: 11,0).? как Gecko \t ViewState: 2bpxzxMEz ... Локально это работает сделано Что можно изменить ViewState на POST – Milan

Смежные вопросы