Làm thế nào tự động thuộc tính SameSite được thêm vào cookie Asp.net_SessionID của tôi?


20

Gần đây samesite = lax tự động thêm vào cookie phiên của tôi! thuộc tính này chỉ cần thêm vào sessionID: "Set-Cookie ASP.NET_SessionId=zana3mklplqwewhwvika2125; path=/; HttpOnly; **SameSite=Lax**"

Trang web của tôi được lưu trữ trên IIS 8.5, Windows 2012 R2 và không có WAF hoặc UrlRewrite và tôi tắt AntiVirus (kasper).

nhưng vẫn có vấn đề tương tự trên một số máy chủ của khách hàng.

bất kỳ ý tưởng?

EDITED: Tôi tìm thấy cái này: https://support.microsoft.com/en-us/help/4524419/kb4524419

Bây giờ ASP.NET sẽ phát ra một tiêu đề cookie SameSite khi giá trị httpCookie.SameSite là 'Không' để điều chỉnh các thay đổi sắp tới đối với việc xử lý cookie SameSite trong Chrome. Là một phần của thay đổi này, cookie FormsAuth và SessionState cũng sẽ được phát hành với SameSite = 'Lax' thay vì mặc định trước đó là 'Không', mặc dù các giá trị này có thể được ghi đè trong web.config.

Làm cách nào tôi có thể ghi đè cookie samesite cho SessionState trong web.config? tôi thêm dòng này, nhưng nó không hoạt động trên cookie SessionID! <httpCookies sameSite="Unspecified" />

EDITED: Tôi tìm thấy cái này: https://docs.microsoft.com/en-us/dotnet/api/system.web.configuration.sessionstatesection.cookiesamesite?view=netframework-4.8#System_Web_Configuration_SessionStateSection_CookieSameSite

Đặt samesite cho máy chủ chính sách theo thuộc tính "cookieSameSite" của thẻ SessionState.


Bạn đã giải quyết xong bằng cách thêm phần mềm <sessionstate CookieSameSite "Tôi đã cài đặt 4.8 nhưng khi tôi truy cập phần sessionstate từ trình quản lý IIS. Tôi chỉ nhận được thuộc tính không được nhận dạng.
Jokies Đinh

1
Tôi nhận được tin nhắn tương tự trong iis, nhưng nó hoạt động và thay đổi giá trị samesite trong thời gian đặt cookie. tôi thêm cookieSameSite = "Không" vào web.config của tôi để có được hành vi ứng xử trước. lưu ý rằng cookieSameSite là caseSesitive.
Sadegh

Tôi vừa phải vá một trang web kế thừa 4.5.2 cho việc này - SameSite không được hỗ trợ bởi các cấu hình nên tôi phải chặn cookie trên Session_Start và viết lại trực tiếp với "SameSite = none; Secure" được thêm vào.
ParanoidCoder

@ParanoidCoder cung cấp cho bạn đề xuất của bạn, tôi sử dụng .net 4.6.1 và nó hoạt động với tôi. Nhưng tôi có một câu hỏi về giải pháp của bạn: bạn sử dụng viết lại URL (phần mở rộng của IIS) hoặc bạn viết lại nó bằng mã trong Session_Start, bạn có thể cho tôi xem mã của bạn không?
Sadegh

Câu trả lời:


19

Thêm các tùy chọn này vào web.config cho sameSite = Không, Lax hoặc Strict

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

1
<httpCookies sameSitekhông được hiển thị dưới dạng tùy chọn hợp lệ trên .Net Framework 4.8
IronSean

Nó có hoạt động cho khung 4.6.1 không?
Ankush Jain

@AnkushJain, không, nó được hỗ trợ kể từ .Net Framework 4.7.2.
Vasiliy Zverev

11

Tôi không thể sử dụng viết lại, vì UrlRewrite không được cài đặt trên tất cả các máy chủ của khách hàng.

Cuối cùng tôi thêm cookieSameSite vào web.config:

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


2
nó chỉ hoạt động sau .net 4.7.2
mrlayeghi

1
tôi sử dụng nó trong .net 4.6.1 và nó hoạt động tốt.
Sadegh

Tôi xin lỗi @ Sadegh.K, nhưng nó sẽ không hoạt động trước 4.7.2 như đã nêu ở đây: docs.microsoft.com/en-us/aspnet/samesite/ phỏng
cederlof

@cederlof tôi đã tìm thấy cái này: support.microsoft.com/en-us/help/4533011/kb4533011
Sadegh

@Sadegh Đúng, nhưng điều đó không thêm cookieSameSitechức năng vào web.config - .NET 4.7.2 thì có. Liên kết tôi đã đăng trong bình luận của tôi cũng được liên kết từ trang bạn tham khảo.
cederlof

8

Thuộc tính CookieSameSite không có sẵn cho nhiều khung cũ hơn. Nếu bạn đang ở trong tình huống mà câu trả lời được chấp nhận không được hỗ trợ trong môi trường của bạn, hãy đọc tiếp!

Tôi đã sửa đổi một số câu trả lời SO để đưa ra cách viết lại URL này để thêm SameSite=Nonevào cookie phiên và cũng xóa SameSite=Nonekhỏi tất cả các cookie cho hầu hết các trình duyệt không tương thích. Mục đích của việc viết lại này là để duy trì hành vi "di sản" trước Chrome 80.

Viết đầy đủ trong blog Coder Frontline của tôi :

<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>

Điều này sẽ hoạt động đối với hầu hết các ứng dụng ASP .Net và ASP .Net Core, mặc dù các Framework mới hơn có các tùy chọn cấu hình và mã phù hợp để cho phép bạn kiểm soát hành vi này. Tôi sẽ khuyên bạn nên nghiên cứu tất cả các tùy chọn có sẵn cho bạn trước khi sử dụng viết lại của tôi ở trên.


Nơi nào bạn đặt điều này trong MVC 5? Trong <system.net></system.net>?
Joel Wiklund

Trong<system.webServer>
zemien

Lưu ý: nếu ASP.NET_SessionId-cookie đã có SameSite=Laxthì nó sẽ chỉ nối thêm SameSite=Nonevà không thay thế nó.
cederlof

@zemien Tôi không hiểu tại sao có (SameSite=.*)?tất cả trong mẫu?
cederlof

1
@cederlof bạn nói đúng! Tôi đã không kiểm tra regex của mình đúng cách vì môi trường của tôi đã cũ hơn. Khung công tác .NET không tự động thêm thuộc tính Lax. Trong trường hợp của bạn, bạn có thể sử dụng một regex khác để loại trừ SameSite=Laxtiêu đề: ((.*)(ASP.NET_SessionId)(=.*))(?=SameSite)Xem regex101.com/r/7D9UdO/3 được cập nhật - tuy nhiên lưu ý rằng regex này sẽ loại trừ mọi thứ bạn có thể muốn sau đó, chẳng hạn như tiêu đề bảo mật. Đây phải là một điều kiện hiếm gặp vì vậy điểm quan trọng là xem ứng dụng OS + framework + của bạn đang phát ra gì và viết regex cho phù hợp. Tôi sẽ cập nhật câu trả lời của mình để phản ánh cả hai cách :)
zemien

7

Cập nhật lần cuối: câu trả lời của zemien toàn diện và đầy đủ hơn câu trả lời của tôi. bởi vì nó đặt cookie dựa trên tác nhân người dùng.

Câu trả lời của tôi:

Bạn có thể thay thế SameSite = Lax bằng SameSite = Không có cho ASP.NET_SessionId trong web.config theo cách sau:

<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>

Cập nhật: Để ngăn sự cố iOS , thay thế

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

với

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

2
Điều này chỉ có thể nếu mô-đun viết lại IIS được cài đặt trên máy chủ
Vincent Ducroquet

1
Bản cập nhật cho sự cố iOS của bạn cũng sẽ gây ra sự cố trong các hệ điều hành mới hơn. Về cơ bản, một số trình duyệt / HĐH sẽ gán SameSite = Lax nếu nó thiếu tiêu đề SameSite. Tôi tin rằng cách duy nhất là thực hiện đánh hơi UserAgent và quyết định có bao gồm tiêu đề hay không. Tôi vẫn đang nghiên cứu nếu điều này có thể được thực hiện thông qua web.config hoặc nó phải bao gồm thay đổi mã trong Session_Start.
zemien

Chỉ cần làm nổi bật những gì @zemien viết, bản cập nhật iOS của bạn khắc phục một vấn đề nhưng lại giới thiệu một vấn đề khác.
cederlof

3

@zemien giải pháp của bạn đã giải quyết chính xác các vấn đề về Google Chrome của chúng tôi

Chúng tôi có một tích hợp trong đó ứng dụng của chúng tôi được nhúng trong iframe trên bên thứ ba. Chrome phiên bản 80 phát hành ngày 4 tháng 2 năm 2020 đã ngăn cookie tải.

Tuy nhiên, tôi đã phải sửa đổi mẫu để chụp tất cả cookie, thêm cờ Bảo mật và điều kiện để không áp dụng ghi lại trên localhost cho môi trường không https cục bộ của chúng tôi

<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

Làm việc cho tôi. Đã thêm vào tệp web.config của tôi:

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

Nâng cấp lên bản vá cài đặt .Net Framework 4.8 +: Cập nhật tích lũy 2019-12 cho .NET Framework 3.5 và 4.8 cho Windows 10 Phiên bản 1909 cho x64 (KB4533002)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.