если я все равно использовал машинный ключ, я получаю эту ошибку. Токен файла cookie для защиты от подделки и токен поля формы не совпадают.

В моем сценарии я размещаю одно и то же приложение mvc на двух разных серверах из-за доступности сервера и избегаю трафика.

когда я вхожу в приложение первые 2-3 раза, я получаю эту ошибку «Токен файла cookie для защиты от подделки и токен поля формы не совпадают». Затем правильно работает приложение.

Ниже приведен файл веб-конфигурации моего приложения.

  <system.web>
        <compilation debug="false" targetFramework="4.6" />
        <httpRuntime targetFramework="4.6" requestValidationMode="4.5" enableVersionHeader="false" />
        <machineKey validationKey="FF4636C4DF933BE453F9B94810661C5F5625794E5DCA46A3C281EB18CC5410386A4B38F5E4C7D7106C049C9EB10F31C2F4E76E74616ABD36DC6C64AF2BFF6801" decryptionKey="667F9049734567FF3E7BC7031DF4B4431F992A447CE2FB3258F6EE989BA82E8F" validation="SHA1" decryption="AES" />
        <httpHandlers>
          <add path="*" verb="OPTIONS" type="System.Web.DefaultHttpHandler" validate="true" />
          <add path="*" verb="TRACE" type="System.Web.DefaultHttpHandler" validate="true" />
          <add path="*" verb="HEAD" type="System.Web.DefaultHttpHandler" validate="true" />
        </httpHandlers>
        <authorization>
          <deny verbs="OPTIONS" users="*" />
          <deny verbs="TRACE" users="*" />
          <deny verbs="HEAD" users="*" />
        </authorization>
        <authentication mode="Forms">
          <forms loginUrl="~/Login/Login" defaultUrl="~/Home/Home" path="/" name="test" cookieless="UseCookies" requireSSL="true" slidingExpiration="false" timeout="2880" protection="All" />
        </authentication>
        <httpCookies httpOnlyCookies="true" requireSSL="true" />
        <sessionState timeout="20" />
        <customErrors mode="On" defaultRedirect="~/Home/ErrorPage" />
        <trace enabled="false" localOnly="true" />
      </system.web>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
      <system.codedom>
        <compilers>
          <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
          <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
        </compilers>
      </system.codedom>
     <system.webServer>
        <validation validateIntegratedModeConfiguration="false" />
        <defaultDocument enabled="false" />
        <httpRedirect enabled="false" />
        <handlers>
          <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
          <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
          <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
          <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
          <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
          <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
        <security>
          <requestFiltering>
            <verbs allowUnlisted="true">
              <add verb="OPTIONS" allowed="false" />
            </verbs>
          </requestFiltering>
        </security>
        <httpProtocol>
          <customHeaders>
            <clear />
            <add name="X-Frame-Options" value="DENY" />
            <remove name="X-Powered-By" />
          </customHeaders>
        </httpProtocol>
      </system.webServer>

и код контроллера

  [HttpGet]
        [AllowAnonymous]
        [OutputCache(NoStore = true, Duration = 3600, VaryByParam = "None")]
        public ActionResult Login()
        {
            UserLoginViewModel um = new UserLoginViewModel();         
            return View(um);
        }

        [HttpPost]
        [AllowAnonymous]        
        [ValidateAntiForgeryToken]              
        public ActionResult Login(UserLoginViewModel u)
        {
            try
            {
              ...
             }
        }
        catch(exception ex)
         {
         }
    }

Посмотреть код

   @using (Html.BeginForm("Login", "Login", FormMethod.Post, new { id = 
       "frmLogin" }))
        {
            @Html.AntiForgeryToken()

            <div class="dialog">
        ....
        </div>
        }

Please Suggest !
Thanks in advanced

person nik    schedule 27.07.2017    source источник
comment
Если вы удалите OutputCache из действия контроллера страницы входа, вы по-прежнему будете показывать ошибки? Токен AntiForgeryRequest генерируется на основе ряда факторов, и я считаю, что текущий DateTime является одним из них. Если вы кешируете токен, то он не будет соответствовать тому, что ожидал сервер (например, это похоже на копирование/вставку его по запросу. Было бы не очень безопасно, если бы вы могли повторно использовать токен для нескольких запросов)   -  person Tommy    schedule 27.07.2017
comment
я поместил кеш вывода, потому что получил эту ошибку. Предоставленный токен защиты от подделки предназначался для пользователя, но текущий пользователь - abc. и если я удалил OutputCache, я все равно получил эту ошибку.   -  person nik    schedule 28.07.2017


Ответы (1)


Просто прокомментируйте следующую строку в вашем Web.config. Она будет работать нормально.

httpCookies httpOnlyCookies="true" requireSSL="true"

person Jayaprakash    schedule 27.07.2017
comment
после комментария этой строки, но все же я впервые получил эту ошибку. - person nik; 28.07.2017