Подтвердить что ты не робот

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

Поскольку наш сайт не может напрямую брать кредитные карты, мы маршрутизируем пользователя, с учетными данными и другими переменными переменных, на "размещенную страницу" на другом сайте.

Чтобы перейти к более подробному описанию, так пользователь получит доступ к этому обычно:

  • Перейдите на наш сайт и войдите в систему с именем пользователя и паролем, которые они создали ранее. Это использует поставщик членства asp.net.

  • После входа в систему мы покажем им свою учетную запись, и у них есть кнопка для оплаты. Как только они нажмут это...

  • Им предлагается страница с предоплатой, чтобы проверить количество и различные другие биты информации. Они нажимают дальше отсюда...

  • Итак, страница оплаты отображается в iframe нашего сайта. Мы перенаправляем их на внешнюю размещенную веб-страницу со следующим кодом:

    < div align = "center" > < iframe width = "100%" height = "600px" src= "@Html.Raw(@ViewBag.GateWayWebsite)" > </DIV>

  • После того, как страница оплаты была введена и клиент нажимает кнопку отправки, этот сайт отправляет сообщение на наш сайт, где они начали, и передает информацию об оплате. Я беру эту информацию и сохраняю ее в нашей базе данных и показываю квитанцию.

Все работает отлично, за исключением # 5. Это работает большую часть времени, но около 1 из 10 возвращается с этим сообщением:

Event code: 4006 
Event message: Membership credential verification failed. 
Event time: 12/16/2013 4:32:22 AM 
Event time (UTC): 12/16/2013 12:32:22 PM 
Event ID: 42c509f2a25d46f0af17e72a52dfbbe5 
Event sequence: 38 
Event occurrence: 1 
Event detail code: 0 

Application information: 
    Application domain: /LM/W3SVC/3/ROOT/SuburbanCustPortal-1-130316693110399868 
    Trust level: Full 
    Application Virtual Path: /SuburbanCustPortal 
    Application Path: C:\inetpub\wp\SuburbanCustPortal\ 
    Machine name: WIN-OB929P97YAR 

Process information: 
    Process ID: 3620 
    Process name: w3wp.exe 
    Account name: NT AUTHORITY\NETWORK SERVICE 

Request information: 
    Request URL: https://myurl:443/SuburbanCustPortal/Account/Logon2 
    Request path: /SuburbanCustPortal/Account/Logon2 
    User host address: xx.xx.xx.xx 
    User:  
    Is authenticated: False 
    Authentication Type:  
    Thread account name: NT AUTHORITY\NETWORK SERVICE 

Name to authenticate: testuser 

Я не могу попасть на несколько тестовых примеров, которые я запускал, что делает его намного более неприятным.

Это мой web.config:

<?xml version="1.0"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=152368
  -->
<configuration>

  <appSettings>
    <add key="webpages:Version" value="1.0.0.0"/>
    <add key="ClientValidationEnabled" value="true"/>
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
    <add key="suburbanServiceUrl" value=""/>
  </appSettings>

  <system.web>

    <sessionState
      mode="InProc"
      stateConnectionString="tcpip=127.0.0.1:42424"
      stateNetworkTimeout="60"
      sqlConnectionString="data source=127.0.0.1;Integrated Security=SSPI"
      cookieless="false"
      timeout="60"
    />

    <customErrors mode="Off"/>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      </assemblies>
    </compilation>
    <authentication mode="Forms">
      <!-- timeout: Gets and sets the amount of time, in minutes, allowed between requests
                    before the session-state provider terminates the session. -->
      <forms loginUrl="~/Account/LogOn" timeout="60"/>
    </authentication>

    <membership>
      <providers>
        <clear/>
        <add name="AspNetSqlMembershipProvider"
             type="System.Web.Security.SqlMembershipProvider"
             connectionStringName="ApplicationServices"
             enablePasswordRetrieval="false"
             enablePasswordReset="true"
             requiresQuestionAndAnswer="false"
             requiresUniqueEmail="true"
             maxInvalidPasswordAttempts="30"
             minRequiredPasswordLength="6"
             minRequiredNonalphanumericCharacters="0"
             passwordAttemptWindow="10"
             applicationName="webportal"/>
      </providers>

    </membership>

    <profile>
      <providers>
        <clear/>
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
      </providers>
    </profile>

    <roleManager enabled="true">
      <providers>
        <clear/>
        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/"/>
        <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/"/>
      </providers>
    </roleManager>

    <pages enableSessionState="true">
      <namespaces>
        <add namespace="System.Web.Helpers"/>
        <add namespace="System.Web.Mvc"/>
        <add namespace="System.Web.Mvc.Ajax"/>
        <add namespace="System.Web.Mvc.Html"/>
        <add namespace="System.Web.Routing"/>
        <add namespace="System.Web.WebPages"/>
      </namespaces>
    </pages>
  </system.web>

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="Session"/>
      <add name="Session" type="System.Web.SessionState.SessionStateModule"/>
    </modules>
    <httpProtocol>
    </httpProtocol>
    <staticContent>
      <clientCache cacheControlCustom="public"
      cacheControlMaxAge="00:00:01" cacheControlMode="UseMaxAge" />
    </staticContent>   
  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_ISuburbanService" maxReceivedMessageSize="128072" />
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:2181/ISuburbanService.svc"
        binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISuburbanService"
        contract="SuburbanService.ISuburbanService" name="BasicHttpBinding_ISuburbanService" />
    </client>
    <!--<bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_ISuburbanService" closeTimeout="00:01:00"
          openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
          allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
          maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
          messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
          useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="Transport">
            <transport clientCredentialType="Basic" proxyCredentialType="None"
              realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="https://localhost/SuburbanHUB/ISuburbanService.svc"
        binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISuburbanService"
        contract="SuburbanService.ISuburbanService" name="BasicHttpBinding_ISuburbanService" />
    </client>-->
    <!--<behaviors>
      <serviceBehaviors>
        <behavior name="SomeServiceServiceBehavior">
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>-->
  </system.serviceModel>
</configuration>

И метод, который фиксирует сообщение:

  [NoCache]
    [HttpPost]
    public ActionResult Receipt(string id)
    {
      var sb = new StringBuilder();
      try
      {
        sb.AppendLine("ActionResult Reciept(string account)");

        var count = 0;
        var postVals = new Dictionary<string, string>();
        foreach (var key in Request.Form.AllKeys)
        {
          sb.AppendLine("count: " + count);
          sb.AppendLine(string.Format("key:   {0}    Value:   {1}", key, Request.Form[key]));
          postVals.Add(key, Request.Form[key]);
          sb.AppendLine("finished count: " + count);
          count++;
        }
        sb.AppendLine("finished processing ALLKeys");
        var paymentReq = createPaymentRequest(postVals);
        sb.AppendLine("finished processing 'var paymentReq = createPaymentRequest(postVals)' ");
        var receipt = _client.RecordPaymentWithRequest(paymentReq);

        var retval = PartialView(receipt.Duplicate ? "Duplicate Receipt" : "Receipt", receipt);
        sb.AppendLine(string.Format("retval: {0}", retval));
        return retval;

      }
      catch (Exception ex)
      {
        sb.AppendLine(string.Format("Receipt error: {0}", ex.Message));
        Logging.LogException("Receipt error!", ex, _asName);
        throw;
      }
      finally
      {
        Logging.LogInfo(sb.ToString(), _asName);
      }
    }

Как вы можете видеть выше, у меня нет [Authorize], поэтому он не должен требовать, чтобы поставщик членства проверял доступ. Уровень класса также не является.

У кого-нибудь есть предложения о том, что может происходить?

UPDATE

2013-12-16 04:22:14 xxx.xxx.xxx.xxx GET /SuburbanCustPortal/Scripts/Views/logon.js - 443 - xxx.xxx.xxx.xxx Mozilla/5.0+(Linux;+Android+4.2.2;+en-us;+SAMSUNG+SGH-M919+Build/JDQ39)+AppleWebKit/535.19+(KHTML,+like+Gecko)+Version/1.0+Chrome/18.0.1025.308+Mobile+Safari/535.19 304 0 0 109
2013-12-16 04:22:14 xxx.xxx.xxx.xxx GET /SuburbanCustPortal/Content/images/mod/modavoca.png - 443 - xxx.xxx.xxx.xxx Mozilla/5.0+(Linux;+Android+4.2.2;+en-us;+SAMSUNG+SGH-M919+Build/JDQ39)+AppleWebKit/535.19+(KHTML,+like+Gecko)+Version/1.0+Chrome/18.0.1025.308+Mobile+Safari/535.19 304 0 0 93
2013-12-16 04:22:15 xxx.xxx.xxx.xxx GET /Content/favicon.ico - 443 - xxx.xxx.xxx.xxx Mozilla/5.0+(Linux;+Android+4.2.2;+en-us;+SAMSUNG+SGH-M919+Build/JDQ39)+AppleWebKit/535.19+(KHTML,+like+Gecko)+Version/1.0+Chrome/18.0.1025.308+Mobile+Safari/535.19 404 0 2 250
2013-12-16 04:22:15 xxx.xxx.xxx.xxx GET /apple-touch-icon-precomposed.png - 443 - xxx.xxx.xxx.xxx Mozilla/5.0+(Linux;+Android+4.2.2;+en-us;+SAMSUNG+SGH-M919+Build/JDQ39)+AppleWebKit/535.19+(KHTML,+like+Gecko)+Version/1.0+Chrome/18.0.1025.308+Mobile+Safari/535.19 404 0 2 250
2013-12-16 04:22:15 xxx.xxx.xxx.xxx GET /apple-touch-icon.png - 443 - xxx.xxx.xxx.xxx Mozilla/5.0+(Linux;+Android+4.2.2;+en-us;+SAMSUNG+SGH-M919+Build/JDQ39)+AppleWebKit/535.19+(KHTML,+like+Gecko)+Version/1.0+Chrome/18.0.1025.308+Mobile+Safari/535.19 404 0 2 78
#Software: Microsoft Internet Information Services 7.0
#Version: 1.0
#Date: 2013-12-16 04:39:52
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status time-taken
2013-12-16 04:39:52 xxx.xxx.xxx.xxx GET / - 443 - xxx.xxx.xxx.xxx - 200 0 0 171
2013-12-16 04:50:12 xxx.xxx.xxx.xxx POST /SuburbanHUB/ISuburbanService.svc - 443 suburbansoftware xxx.xxx.xxx.xxx - 200 0 0 875
2013-12-16 04:50:12 xxx.xxx.xxx.xxx POST /SuburbanHUB/ISuburbanService.svc - 443 suburbansoftware xxx.xxx.xxx.xxx - 200 0 0 187
2013-12-16 04:50:12 xxx.xxx.xxx.xxx GET /SuburbanCustPortal/Account/Verify id=dde4bbfb-0d2e-4706-a604-36eea3fdcae3&verifyid=c0b4fdb5-9bb3-4d2b-b724-df42e6ea2a59 443 - xxx.xxx.xxx.xxx Mozilla/5.0+(iPhone;+CPU+iPhone+OS+7_0_3+like+Mac+OS+X)+AppleWebKit/537.51.1+(KHTML,+like+Gecko)+Version/7.0+Mobile/11B511+Safari/9537.53 200 0 0 1328
2013-12-16 04:50:12 xxx.xxx.xxx.xxx GET /SuburbanCustPortal/Content/reset.css - 443 - xxx.xxx.xxx.xxxMozilla/5.0+(iPhone;+CPU+iPhone+OS+7_0_3+like+Mac+OS+X)+AppleWebKit/537.51.1+(KHTML,+like+Gecko)+Version/7.0+Mobile/11B511+Safari/9537.53 200 0 0 453

В журнале регистрируется провал с 04:22:15 по 04:39:52

Это нормально?

ИЗМЕНИТЬ

Я разъяснил вышеприведенные шаги для тех, кто спросил.

4b9b3361

Ответ 1

Это ужасно подозрительно случиться в то время.

Я бы согласился, но кажется, что на шаге 4 вы перенаправляете сайт, а затем пользователь вводит данные. Если пользователь время от времени занимает 10-20 минут, чтобы ввести эту информацию (из-за отвлечения внимания и т.д.), Это делает ее гораздо более вероятной, чем если бы это было просто условие гонки.

Если у вас все еще есть данные из всех ошибок, вы можете посмотреть назад, чтобы увидеть, можете ли вы найти шаблон в моменты, когда это происходит (или каждые xx часов - см. ниже).

  • Проверьте настройки IIS, чтобы увидеть, когда пул приложений перерабатывается. Перерабатывает ли она около 4 утра каждую ночь? Это по расписанию? По умолчанию IIS перерабатывает какое-то нечетное количество часов по какой-либо причине (я думаю, каждые 28 часов).
  • Выйдите из состояния сеанса InProc и в State Server (или SQL). InProc только причинит вам боль в любом случае в долгосрочной перспективе. Обратите внимание, что когда вы делаете это изменение, вы должны убедиться, что все объекты, которые вы помещаете в сеанс, являются сериализуемыми, иначе вы получите ошибки. InProc не требует, чтобы объекты были сериализованы в сеансе.

Edit: Хорошо, чтобы проверить утилиту пула приложений:

  • В диспетчере IIS выберите соответствующий пул приложений и выберите "Дополнительные настройки" (щелкните правой кнопкой мыши или используйте меню справа).
  • Прокрутите вниз, в раздел Recycling
  • Обычный временной интервал будет reset пулом приложений каждые xx минут. Значение по умолчанию - 1740 минут или каждые 29 часов.
  • Параметр Specific Times позволяет вам установить запланированное время для его переработки.

В общем, вы хотите периодически перерабатывать пул приложений (возможно, ежедневно).

Чтобы ответить на второй вопрос: , если, это действительно причина, это не вопрос тайм-аута; это вопрос о том, перезаписывается ли пул приложений в течение периода времени между тем, когда они перенаправляются и когда они перенаправляются обратно. Изменение состояния сеанса на что-то другое, кроме InProc, должно решить эту проблему.

Таким образом, завершение сеанса также может быть причиной этого, поэтому установка тайм-аута сеанса на большее значение также может решить эту проблему.

Если вы более подробно рассмотрите журналы в периоды времени, когда это произошло, это может дать больше информации о том, что происходит.

Изменить # 2

Посмотрите, можете ли вы изолировать вхождения ошибок в журналах. Если возможно, посмотрите, есть ли шаблон для используемого браузера. Я также хотел бы найти другие шаблоны, чтобы увидеть, что что-то выпрыгивает.

Вы можете просто протестировать кучу разных браузеров (в том числе мобильных), чтобы увидеть, можете ли вы воспроизвести. Кроме того, попробуйте разные версии IE и различные параметры безопасности в IE.

Ответ 2

Несколько вещей, которые я нашел в вашем web.config, -

  • У вас есть несколько имя_приложения. Обычно IsUserInRole и GetRolesForUser должны работать, если имя_приложения не совпадают.

  • Кроме того, вы хотите установить defaultProvider для каждого провайдера, особенно если у вас есть более одного провайдера, например roleManager - <roleManager ... defaultProvider="DefaultRoleProvider">

Текущий Web.config

<membership>
   <providers>
      <clear/>
          <add ... applicationName="webportal"/>
   </providers>
</membership>

<profile>
   <providers>
      <clear/>
      <add ... applicationName="/"/>
    </providers>
</profile>

<roleManager enabled="true">
   <providers>
      <clear/>
      <add ... applicationName="/"/>
      <add ...  applicationName="/"/>
   </providers>
</roleManager>

Взгляните на web.config Скотта Ханзельмана Блог ASP.NET Universal Providers.

<sessionState
   mode="InProc"
   stateConnectionString="tcpip=127.0.0.1:42424"
   stateNetworkTimeout="60"
   sqlConnectionString="data source=127.0.0.1;Integrated Security=SSPI"
   cookieless="false"
   timeout="60"
/>

Вам не нужно stateConnectionString, stateNetworkTimeout и sqlConnectionString для InProc. Подробнее здесь.

Ответ 3

Пожалуйста, обратитесь к следующей статье ScottGu http://weblogs.asp.net/scottgu/archive/2006/04/22/Always-set-the-_2200_applicationName_2200_-property-when-configuring-ASP.NET-2.0-Membership-and-other-Providers.aspx.

Кроме того, убедитесь, что значение "ApplicationName" в таблице базы данных "aspnet_Applications" и значение свойства "applicationName" для всех поставщиков в web.config(поставщик членства, поставщик ролей, поставщик профиля и т.д.) должны иметь одинаковые снова тщательно.

Надеюсь, это исправит вашу проблему!

Ответ 4

Это было некоторое время, так как у меня есть проблемы с подобными проблемами (но я сделал это для pss более 7 лет назад).

Все, что рекомендовал @PhilSandler, является хорошим. Тем не менее, у меня есть ощущение, что основная причина - это не утилизация AppPool или аутсайты сеанса, если вы отчаиваетесь, вы можете попробовать Out-Of-Process Session State.

Я думаю, если его примерно 1 из 10 пользователей и он выглядит прерывистым (так как вы не можете воспроизвести его), то, вероятно, он будет специфичным для браузера. Я предполагаю, что пользователи, столкнувшиеся с проблемой, отключили файлы cookie в своих браузерах (пользователи FF и Chrome больше включены, чем обычные пользователи IE).

Эта гипотеза слегка совпадала бы с теорией @SilverlightFox:

набор фреймов, предотвращающий сторонние файлы cookie


<authentication mode="Forms">

Я думаю, что аутентификация форм не может хранить данные сеанса на стороне клиента. Не удалось подтвердить верификацию учетных записей Записи журнала событий могут быть вызваны из-за запрещенных файлов cookie.

Пожалуйста, отключите файлы cookie в FF или Chrome и попробуйте мою гипотезу. Пальцы, пересекающие это, позволяют воспроизводить его.

Ответ 5

Осмотрев веб-страницы, вы найдете решения, которые я нашел там, где у вас была ошибка 4006, и в конечном итоге устранила проблему.

  • Поле
  • applicationName установлено на "/" . - Это самый распространенный разговор о вашей проблеме. Но ваше поле applicationName выглядит отлично, так что определенно не оно.

  • Проблема с ActiveDirectoryMembershipProvider - Ссылка. Это вряд ли будет вашей проблемой, потому что вы используете SqlMembershipProvider.

  • Пользователь Интернета пропускает разрешения на файлы .mdf и .ldf - Ссылка. Ссылки на эту проблему, которые я видел, были с людьми, использующими SQLExpress, потому что они выполняются под учетной записью пользователя ASP.NET и требуют доступа для чтения/записи. Опять же, это вряд ли будет вашей проблемой, потому что у вас будет только периодический переход. Но это связано с ошибкой 4006, поэтому проверка прав доступа к пользователю, похоже, стоит посмотреть.

  • Дублированные пароли пользователей. Я не сохранил ссылку, но если у вас нет уникальных ограничений для имени пользователя и пароля в базе данных, он может вернуть ответ 4006. Таким образом, далеко это кажется мне более вероятным, потому что это объясняет прерывистое поведение и потому, что люди часто дважды щелкают при использовании Интернета. Я бы удвоил и утроил ваши ограничения.

Я буду рад видеть, что еще я могу найти, но исключение последних двух из них сначала кажется хорошей идеей. Кроме того, то, что кажется наиболее странным в разрыве в ваших журналах, заключается в том, что данные EventLog показывают, что ошибка происходит почти в середине разрыва IIS. Затем после его возобновления появляется еще один брешь. Похоже, что это могут быть два совершенно разных пользователя. Возможно, нет, просто выбросьте это. Дай мне знать. Удачи.

Ответ 6

Я заметил, что src неправильно установлен на IFrame.

<div align="center"> <iframe width="100%" height="600px" src="@Html.Raw(@ViewBag.GateWayWebsite)"></iframe></div>

GateWayWebsite должен быть правильно закодирован в HTML, если он содержит специальные символы, которые являются релевантными, но не передаются должным образом:

<div align="center"> <iframe width="100%" height="600px" src="@ViewBag.GateWayWebsite"></iframe></div>

Другая мысль заключается в том, что может быть, что набор фреймов, который предотвращает сторонние файлы cookie - либо настройки браузера, либо заголовок политики конфиденциальности P3P. Попробуйте открыть ссылку вне IFrame (т.е. Поэтому адресная строка изменится на внешний сайт), как тест, чтобы проверить, устраняют ли это ваши проблемы.

Изменить: Я не должен был редактировать свой ответ, так как теперь вы вернули свой верхний уровень. Мой ответ технически корректен, хотя это может быть не тот ответ, который исправляет вашу текущую проблему, я прав, что вывод URL-адреса неверен, поскольку вы не кодируете его в формате HTML. Я считаю, что лучше всего исправить все, так как это уменьшает шансы на ошибки в будущем, которые трудно отлаживать.