Правило перезаписи исходящего трафика IIS с условием, основанным на запросе (web.config) - PullRequest
0 голосов
/ 17 января 2020

У меня сейчас проблема с тем, что IIS обслуживает все мои куки с атрибутом sameSite = lax после обновления. Net Framework на Windows сервере (https://support.microsoft.com/en-us/help/4524419/kb4524419 )

Проблема похожа на , как атрибут SameSite добавляется в мой Asp .net_SessionID cook ie автоматически?

Это нарушает функциональность большинства IFrames которые используются на веб-страницах с другим доменом, так как браузер не отправляет ASP. Net Session-ID обратно на сервер с последующими запросами.

Теперь, хотя в вышеупомянутой теме есть некоторые предложения, они действительно не работают для меня. Это связано с нестандартным поведением Safaris. Safari в MacOSX и iOS 12.x рассматривает значение «None» для атрибута sameSite как неизвестное и поэтому устанавливает значение «Strict», что снова нарушает функциональность IFrames для пользователей Safari.

Теперь мне интересно, возможно ли определить исходящее правило перезаписи в IIS web.config, который сначала проверяет заголовок запроса, чтобы узнать, использует ли клиент браузер Safari. В зависимости от браузера клиента, разные версии правил перезаписи исходящих файлов должны изменять файлы cookie в соответствии с ожиданиями браузера.

Можно ли написать исходящие правила с условиями, основанными на запросе? Я не нашел какой-либо документации или веб-сайта с указанием этих работ ...

1 Ответ

1 голос
/ 23 февраля 2020

Я изменил несколько ответов SO, чтобы предложить переписать этот URL, который добавляет SameSite=None к сеансовым cookie-файлам, а также удаляет SameSite=None из всех cookie-файлов для большинства несовместимых браузеров. Цель этого переписывания состоит в том, чтобы сохранить «устаревшее» поведение до Chrome 80. Оно конкретно охватывает Safari для MacOSX и сценарий iOS 12.x, о котором вы упомянули.

Полная запись в моем Блог Coder Frontline :

<rewrite>
  <outboundRules>
    <preConditions>
      <!-- Checks User Agent to identify browsers incompatible with SameSite=None -->
      <preCondition name="IncompatibleWithSameSiteNone" logicalGrouping="MatchAny">
        <add input="{HTTP_USER_AGENT}" pattern="(CPU iPhone OS 12)|(iPad; CPU OS 12)" />
        <add input="{HTTP_USER_AGENT}" pattern="(Chrome/5)|(Chrome/6)" />
        <add input="{HTTP_USER_AGENT}" pattern="( OS X 10_14).*(Version/).*((Safari)|(KHTML, like Gecko)$)" />
      </preCondition>
    </preConditions>

    <!-- Adds or changes SameSite to None for the session cookie -->
    <!-- Note that secure header is also required by Chrome and should not be added here -->
    <rule name="SessionCookieAddNoneHeader">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="((.*)(ASP.NET_SessionId)(=.*))(SameSite=.*)?" />
      <action type="Rewrite" value="{R:1}; SameSite=None" />
    </rule>

    <!-- Removes SameSite=None header from all cookies, for most incompatible browsers -->
    <rule name="CookieRemoveSameSiteNone" preCondition="IncompatibleWithSameSiteNone">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="(.*)(SameSite=None)" />
      <action type="Rewrite" value="{R:1}" />
    </rule>
  </outboundRules>
</rewrite>

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

...