SameSite 속성이 어떻게 Asp.net_SessionID 쿠키에 자동으로 추가 되었습니까?


20

최근 samesite = lax가 자동으로 내 세션 쿠키에 추가합니다! 이 속성은 sessionID에 추가됩니다. "Set-Cookie ASP.NET_SessionId=zana3mklplqwewhwvika2125; path=/; HttpOnly; **SameSite=Lax**"

내 웹 사이트는 IIS 8.5, Windows 2012 R2에서 호스팅되며 WAF 또는 UrlRewrite가 없으며 AntiVirus (kasper)를 끕니다.

그러나 일부 고객 서버에서도 동일한 문제가 있습니다.

어떤 생각?

편집 : 나는 이것을 찾는다 : https://support.microsoft.com/en-us/help/4524419/kb4524419

Chrome에서 SameSite 쿠키 처리에 대한 향후 변경 사항을 수용하기 위해 HttpCookie.SameSite 값이 '없음'인 경우 ASP.NET에서 SameSite 쿠키 헤더를 내 보냅니다. 이 변경의 일부로 FormsAuth 및 SessionState 쿠키는 이전 기본값 인 '없음'대신 SameSite = 'Lax'와 함께 발행되지만,이 값은 web.config에서 재정의 될 수 있습니다.

web.config에서 SessionState에 대한 동일한 사이트 쿠키를 재정의하려면 어떻게해야합니까? 이 줄을 추가했지만 SessionID 쿠키에서 작동하지 않습니다! <httpCookies sameSite="Unspecified" />

편집 : 나는 이것을 발견한다 : https://docs.microsoft.com/en-us/dotnet/api/system.web.configuration.sessionstatesection.cookiesamesite?view=netframework-4.8#System_Web_Configuration_SessionStateSection_CookieSameSite

SessionState 태그의 "cookieSameSite"속성으로 stateserver에 대해 동일한 사이트를 설정하십시오.


“<sessionstate CookieSameSite”를 추가하면 문제가 해결 되었습니까? 4.8을 설치했지만 IIS 관리자에서 sessionstate 섹션에 액세스하면 인식 할 수없는 속성 만 수신됩니다
Jokies Ding

1
iis에서 동일한 메시지를 수신하지만 작동하고 설정된 쿠키 시간에 동일한 사이트 값을 변경합니다. web.config에 cookieSameSite = "None"을 추가하여 이전 행동을 얻습니다. cookieSameSite는 caseSesitive입니다.
Sadegh

방금 4.5.2 레거시 사이트를 패치해야했습니다. SameSite는 구성에서 지원되지 않았으므로 Session_Start에서 쿠키를 가로 채서 "SameSite = None; Secure"를 추가하여 직접 다시 작성해야했습니다.
편집증 코더

@ParanoidCoder 탱크 당신의 제안을 위해, 나는 .net 4.6.1을 사용하고 그것은 나를 위해 작동합니다. 그러나 솔루션에 대한 질문이 있습니다 .URL 다시 쓰기 (IIS의 확장)를 사용하거나 Session_Start의 코드로 다시 작성하십시오. 코드를 보여 주시겠습니까?
Sadegh

답변:


19

sameSite = None, Lax 또는 Strict에 대해 이러한 옵션을 web.config에 추가하십시오.

<system.web>
    <httpCookies sameSite="None"/>
    <sessionState cookieSameSite="None" />
    <authentication mode="Forms">
        <forms cookieSameSite="None" />
    </authentication>

1
<httpCookies sameSite.Net Framework 4.8
IronSean

4.6.1 프레임 워크에서 작동합니까?
Ankush Jain

@AnkushJain, 아니요. .Net Framework 4.7.2부터 지원됩니다.
Vasiliy Zverev

11

모든 고객 서버에 UrlRewrite가 설치되어 있지 않기 때문에 다시 쓰기를 사용할 수 없습니다.

마지막으로 cookieSameSite를 web.config에 추가합니다.

<sessionState mode="StateServer" cookieSameSite="None" sqlConnectionString="data source=(local);user id=sa;password=" cookieless="false" timeout="20" />


2
.net 4.7.2 이후에만 작동
mrlayeghi

1
.net 4.6.1에서 사용하고 제대로 작동합니다.
Sadegh

@ Sadegh.K 죄송하지만 여기에 설명 된대로 4.7.2 이전에는 작동하지 않습니다. docs.microsoft.com/en-us/aspnet/samesite/…
cederlof

@cederlof 이걸 찾았습니다 : support.microsoft.com/en-us/help/4533011/kb4533011
Sadegh

@Sadegh 맞습니다.하지만 cookieSameSiteweb.config에 기능을 추가 하지는 않습니다. .NET 4.7.2는 기능을 수행합니다. 내 의견에 게시 한 링크는 귀하가 참조하는 페이지와도 연결되어 있습니다.
cederlof

8

CookieSameSite 속성은 많은 이전 프레임 워크에서 사용할 수 없습니다. 귀하의 환경에서 허용되는 답변이 지원되지 않는 상황이라면 계속 읽으십시오!

SameSite=None세션 쿠키에 추가 하고 가장 호환되지 않는 브라우저의 모든 쿠키 SameSite=None에서 제거 하는이 URL 다시 쓰기를 제공하기 위해 여러 가지 SO 답변을 수정했습니다 . 이 재 작성의 목표는 Chrome 80 이전의 "레거시"동작을 유지하는 것입니다.

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.*)" />
      <!-- Use this regex if your OS/framework/app adds SameSite=Lax automatically to the end of the cookie -->
      <!-- <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>

최신 Framework에는 이러한 동작을 제어 할 수있는 적절한 코드 및 구성 옵션이 있지만 대부분의 ASP .Net 및 ASP .Net Core 응용 프로그램에서 작동합니다. 위의 재 작성을 사용하기 전에 사용 가능한 모든 옵션을 조사하는 것이 좋습니다.


이것을 MVC 5에 어디에 넣습니까? 에서 <system.net></system.net>?
Joel Wiklund

<system.webServer>
zemien

참고 : ASP.NET_SessionId-cookie SameSite=Lax에이 기능이 이미 있으면이 기능 만 추가 SameSite=None하고 대체하지는 않습니다.
cederlof

@zemien 나는 왜 (SameSite=.*)?패턴을 전혀 얻지 못했 습니까?
cederlof

1
@cederlof 당신이 맞아요! 내 환경이 Lax 속성을 자동으로 추가하지 않는 오래된 .Net 프레임 워크이기 때문에 정규 표현식을 올바르게 테스트하지 않았습니다. 귀하의 경우에는, 당신은 제외 할 다른 정규식을 사용할 수 있습니다 SameSite=Lax헤더 : ((.*)(ASP.NET_SessionId)(=.*))(?=SameSite)업데이트를 참조하십시오 regex101.com/r/7D9UdO/3 - 아무것도 제외됩니다이 정규식 당신은 보안 헤더로, 나중에 할 수 있지만 메모를. 이것은 드문 조건이므로 OS + 프레임 워크 + 앱이 무엇을 방출하는지 확인하고 정규식을 작성하십시오. 나는 두 가지 방법을 모두 반영하기 위해 답변을 업데이트 할 것입니다 :)
zemien

7

마지막 업데이트 : zemien의 대답 은 내 것보다 포괄적이고 완전합니다. 사용자 에이전트를 기반으로 쿠키를 설정하기 때문입니다.

내 답변 :

web.config에서 SameSite = Lax를 ASP.NET_SessionId에 대해 SameSite = None으로 바꿀 수 있습니다.

<rewrite>
  <outboundRules>
    <rule name="AddSameSiteCookieFlag">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="((.*)(ASP.NET_SessionId)(=.*))(SameSite=Lax)" />
      <action type="Rewrite" value="{R:1};SameSite=None" />
    </rule>
  </outboundRules>
</rewrite>

업데이트 : IOS 문제 를 방지하려면 교체

<action type="Rewrite" value="{R:1};SameSite=None" />

<action type="Rewrite" value="{R:1};" />

2
서버에 IIS 다시 쓰기 모듈이 설치된 경우에만 가능합니다.
Vincent Ducroquet

1
iOS 업데이트로 인해 새로운 OS에서 문제가 발생할 수도 있습니다. 기본적으로 일부 브라우저 / OS는 SameSite 헤더가없는 경우 SameSite = Lax를 할당합니다. 유일한 방법은 UserAgent 스니핑을 수행하고 헤더를 포함할지 여부를 결정하는 것입니다. web.config를 통해 수행 할 수 있는지 또는 Session_Start에 코드 변경 사항을 포함시켜야하는지 여전히 연구 중입니다.
zemien

@zemien이 쓰는 것을 강조하기 위해 iOS 업데이트는 한 가지 문제를 해결하지만 다른 문제를 소개합니다.
cederlof

3

@zemien 솔루션이 Google 크롬 문제를 올바르게 해결했습니다.

우리는 응용 프로그램이 타사의 iframe에 포함 된 통합 기능을 갖추고 있습니다. 2020 년 2 월 4 일에 출시 된 Chrome 버전 80에서는 쿠키가로드되지 않았습니다.

그러나 모든 쿠키를 캡처하고 Secure 플래그를 추가하고 로컬 비 https 환경에 대해 localhost에 다시 쓰기를 적용하지 않도록 조건을 수정해야했습니다.

<rule name="SessionCookieAddNoneHeader">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="(.*)(SameSite=.*)?" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
      </conditions>
      <action type="Rewrite" value="{R:1}; SameSite=None; Secure" />
</rule>

1

나를 위해 작동합니다. 내 web.config 파일에 추가되었습니다.

<sessionState cookieSameSite="None"></sessionState>

.Net Framework 4.8 + 설치 패치로 업그레이드 : 2019 년 12 월 x64 용 Windows 10 버전 1909의 .NET Framework 3.5 및 4.8 용 누적 업데이트 (KB4533002)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.