ARR misturando variáveis do servidor HTTP entre usuários do cliente

5

O que estou tentando fazer?

Estou configurando a implantação de azul e verde para obter uma implantação sem tempo de inatividade.

Como está a implementação?

  1. Eu tenho um servidor.
  2. Eu criei um web farm.
  3. Eu defini três sites em azul, verde e principal em diferentes portas. Main lida com todas as solicitações dos clientes e reescreve as solicitações para o web farm.
  4. O Web farm roteia a solicitação para o site ativo (azul ou verde) via ARR (Application Request Routing)
  5. Como os sites azuis / verdes recebem a solicitação do Web Farm / ARR, o REMOTE_ADDR (endereço IP do cliente) mostra 127.0.0.1.
  6. Eu não quero isso, embora seja esperado, eu criei uma regra de regravação de URL que define a variável de servidor HTTP_X_FORWARDED_FOR_INTERNAL com REMOTE_ADDR no site principal.
  7. Eu criei outra regra em sites azuis / verdes que define a variável de servidor REMOTE_ADDR com HTTP_X_FORWARDED_FOR_INTERNAL que vem do site principal.
  8. No resultado, estou recebendo o REMOTE_ADDR como endereço IP do cliente real. YAY!
  9. Tudo funciona bem com o usuário único cliente.

O que não está funcionando como esperado?

Quando eu me conecto ao site a partir de endereços IP diferentes, especialmente para conteúdo estático - aplicativos azuis / verdes que recebem endereços IP incorretos (REMOTE_ADDR) que são de propriedade de outro cliente.

Exemplo:

  1. A e B são diferentes endereços IP.
  2. A conecta-se a foo.com/somestaticfile.css.
  3. B conecta-se a foo.com/somestaticfile.css.

Quando eu verifico os logs do aplicativo IIS, o log da solicitação vindo de B mostra o endereço IP como 'A', embora deva ser B!

Também posso confirmar que a solicitação está vindo de B de acordo com o cookie, estamos mantendo o endereço IP no cookie e o endereço IP no cookie não é igual a REMOTE_ADDR de acordo com o log do aplicativo do IIS.

Editar: capturei outro problema, "às vezes" alguns tipos de mime da resposta do javascript estão se tornando "text / html" em respostas, já que implementamos o X-Content-Type-Options = nosniff, esses scripts não estão sendo carregados pelo navegador.

Refused to execute script from 'https://foo.com/bundles/scripts/common?v=Pc3UWD-GF8GEIazC15mnIr_UYtcH3cQPlDPwAf2cXtU1' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled.

Editar 2 : Eu encontrei algo útil. Quando visito algum link que retorna 40x código de status. O erro relacionado com o endereço IP reproduzindo todas as vezes. E aqui está o URL que eu estou sendo redirecionado, depois que eu não me autentiquei.

link

O valor decodificado do returnUrl é: "/ error / notfound /? 404; link "

Estranho?

O que tentei resolver a situação?

Eu pensei que fosse algum tipo de problema de cache, então eu desabilitei todos os mecanismos de cache que eu sei quais são;

  1. Cache do IIS desativado nas configurações globais.
  2. Cache ARR desativado por meio da criação da regra de controle de cache.
  3. Cache de farm da web desativado.

No entanto, não funcionou.

Limpei todas as configurações e usei ARR Helper , que é desenvolvido para encaminhar o endereço IP para o aplicativo web mais atrasado em configurações como essa, eu encontrei com o mesmo problema.

Arquivos de configuração que você pode precisar

Regra que define HTTP_X_FORWARDED_FOR_INTERNAL no aplicativo principal da web.

<rule name="Set HTTP_X_FORWARDED_FOR_INTERNAL">
                <match url="(.*)" />
                <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
                <serverVariables>
                    <set name="HTTP_X_FORWARDED_FOR_INTERNAL" value="{REMOTE_ADDR}" />
                </serverVariables>
                <action type="None" />
            </rule>

Regra que define o REMOTE_ADDR em aplicativos azuis / verdes.

<rule name="Set REMOTE_ADDR">
      <match url="(.*)" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{HTTP_X_FORWARDED_FOR_INTERNAL}" pattern="^$" negate="true" />
      </conditions>
      <serverVariables>
        <set name="REMOTE_ADDR" value="{HTTP_X_FORWARDED_FOR_INTERNAL}" />
        <set name="REMOTE_HOST" value="{HTTP_X_FORWARDED_FOR_INTERNAL}" />
      </serverVariables>
      <action type="None" />
    </rule>

Regra que desativou o armazenamento em cache da ARR no nível global.

 <rewrite>
        <globalRules>
            <rule name="ARR_CacheControl_9dc69ea7-26f6-4654-af58-2e289d681463" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
                <match url="*" />
                <serverVariables>
                    <set name="ARR_CACHE_CONTROL_OVERRIDE" value="1,no-cache" />
                </serverVariables>
                <action type="None" />
            </rule>
        </globalRules>
    </rewrite>

Configuração inteira do web farm

<webFarms>
    <webFarm name="iissucks" enabled="true">
        <server address="bluecloud" enabled="true">
            <applicationRequestRouting httpPort="880" httpsPort="8443" />
        </server>
        <server address="greencloud" enabled="true">
            <applicationRequestRouting httpPort="980" httpsPort="9443" />
        </server>
        <applicationRequestRouting>
            <healthCheck url="https://iissucks/account/signin" interval="00:00:01" statusCodeMatch="200-599" responseMatch="I_am_healthy." />
            <protocol xForwardedForHeaderName="X-Forwarded-For-Farm" includePortInXForwardedFor="false">
                <cache enabled="false" queryStringHandling="NoCaching" validationInterval="00:00:00" />
            </protocol>
        </applicationRequestRouting>
    </webFarm>
    <applicationRequestRouting>
        <hostAffinityProviderList>
            <add name="Microsoft.Web.Arr.HostNameRoundRobin" />
        </hostAffinityProviderList>
    </applicationRequestRouting>
</webFarms>
    
por Oğuzhan Topçu 19.10.2017 / 14:29

1 resposta

0

Estou longe de ser um especialista em IIS, mas achei seu problema interessante. Vejo que sua regra de desativação do cache global possui um parâmetro stopProcessing="true" definido. Talvez suas regras de configuração variável simplesmente não estejam sendo executadas depois que a regra de desativação do cache parar de processar quaisquer outras regras.

    
por 26.10.2017 / 00:02