ฉันจะตั้งค่าสถานะที่ปลอดภัยในคุกกี้เซสชัน ASP.NET ได้อย่างไร


146

ฉันจะตั้งค่าการตั้งค่าสถานะที่ปลอดภัยบนคุกกี้เซสชัน ASP.NET เพื่อที่มันจะถูกส่งผ่าน HTTPS และไม่เคยผ่าน HTTP ธรรมดา?

คำตอบ:


127

มีสองวิธีhttpCookiesองค์ประกอบหนึ่งในการweb.configอนุญาตให้คุณเปิดใช้งานrequireSSLซึ่งจะส่งเฉพาะคุกกี้ทั้งหมดรวมถึงเซสชันใน SSL เท่านั้นและยังอยู่ในรูปแบบการรับรองความถูกต้อง แต่ถ้าคุณเปิด SSL บน httpcookies คุณจะต้องเปิดใช้งานภายในการกำหนดค่าฟอร์มด้วย

แก้ไขเพื่อความชัดเจน: ใส่สิ่งนี้ใน<system.web>

<httpCookies requireSSL="true" />

13
+1 เพื่อชี้แจงนี่คือสิ่งที่คุณควรเพิ่มใน web.config เพื่อตั้งค่าสถานะที่ปลอดภัยบนคุกกี้รับรองความถูกต้องเป็นจริง<httpCookies requireSSL="true" />
Tr1stan

8
โปรดทราบว่าสิ่งนี้ขึ้นอยู่กับการกำหนดค่า (ระดับเซิร์ฟเวอร์) ของคุณ ฉันทำให้ภูมิภาคการทดสอบมีข้อผิดพลาด "แอปพลิเคชันได้รับการกำหนดค่าให้ออกคุกกี้ที่ปลอดภัยคุกกี้เหล่านี้ต้องการให้เบราว์เซอร์ออกคำขอผ่าน SSL (โปรโตคอล https) อย่างไรก็ตามคำขอปัจจุบันไม่ผ่าน SSL" นี่เป็นเพราะเรามีพร็อกซีย้อนกลับในสถานที่และเบราว์เซอร์เชื่อมต่อกับมันผ่าน SSL แต่พร็อกซีย้อนกลับไปยังเซิร์ฟเวอร์ IIS อยู่เหนือพอร์ต 80 ดังนั้นแอปพลิเคชันไม่คิดว่ามันปลอดภัย
mlhDev

4
@Bargitta เราจัดการเหตุการณ์ Application_PreSendRequestHeaders และหากการตั้งค่าแอปพลิเคชันบางอย่างเป็นจริงเราจะตั้งค่าคุกกี้ทั้งหมดให้ปลอดภัย การตั้งค่าแอพนี้ถูกตั้งค่าสำหรับไซต์ภายนอก HTTPS ของเราเท่านั้น
mlhDev

ฉันเข้าใจแล้วดังนั้นไซต์ภายนอกทั้งหมดของคุณจะใช้ HTTPS ขอบคุณ
Bargitta

ฉันเห็นที่อื่นหลังจาก IIS7 system.web ถูกแทนที่ด้วย system.webserver ดังนั้นฉันจึงลองทำการตั้งค่านี้ที่นั่น ใน IIS 8.5 นี้ทำให้เกิดข้อผิดพลาดการตั้งค่า แต่มันทำงานได้ทั้งหมดถ้าฉันเพิ่มส่วน system.web ไปยังไฟล์ config และตั้งค่าในนั้น
Eborbob

181

ใน<system.web>องค์ประกอบเพิ่มองค์ประกอบต่อไปนี้:

<httpCookies requireSSL="true" />

แต่ถ้าคุณมี<forms>องค์ประกอบของคุณในsystem.web\authenticationบล็อกแล้วนี้จะแทนที่การตั้งค่าในการตั้งค่ามันกลับไปเริ่มต้นhttpCookiesfalse

ในกรณีนั้นคุณต้องเพิ่มแอrequireSSL="true"ททริบิวให้กับองค์ประกอบของฟอร์มด้วย

ดังนั้นคุณจะจบลงด้วย:

<system.web>
    <authentication mode="Forms">
        <forms requireSSL="true">
            <!-- forms content -->
        </forms>
    </authentication>
</system.web>

ดูที่นี่และที่นี่สำหรับเอกสาร MSDN ขององค์ประกอบเหล่านี้


2
คุณสามารถหลีกเลี่ยงการตั้งค่า web.config อื่น ๆ ได้มากกว่าการตั้งค่า <httpCookies neededSSL = "true" /> ของคุณโดยรวมแอตทริบิวต์ 'lockItem' เช่นเดียวกับ: <httpCookies neededSSL = "true" lockItem = "true" /> ข้อมูลเพิ่มเติมที่นี่dotnetnoob.com/2010/11/how-to-secure-aspnet-cookies.html
JTech

1
นอกจากนี้หากมีroleManagerองค์ประกอบcookieRequireSSL="true"ควรตั้งค่าแอตทริบิวต์เป็นจริง อ้าง msdn.microsoft.com/en-us/library/…
Jeff Mergler

โดยการเพิ่มการเปลี่ยนแปลงข้างต้นในไฟล์ที่เกี่ยวข้องวัตถุเซสชันไม่ทำงานในแอปพลิเคชันของฉันพวกเขาจะกลายเป็นโมฆะ ฉันจะแก้ไขปัญหานี้ได้อย่างไร
satya

คุณใช้ HTTP หรือ HTTPS สำหรับแอปของคุณหรือไม่ การตั้งค่าสถานะ "ปลอดภัย" ที่เราตั้งไว้ที่นี่ป้องกันไม่ให้มีการส่งคุกกี้ผ่านการเชื่อมต่อที่ไม่ได้เข้ารหัส (เช่น HTTP)
Martin Eden

21

สิ่งต่าง ๆ ยุ่งเหยิงอย่างรวดเร็วหากคุณกำลังพูดถึงโค้ดเช็คอินในสภาพแวดล้อมขององค์กร เราพบว่าวิธีที่ดีที่สุดคือการมีเว็บรีลีส.configประกอบด้วยสิ่งต่อไปนี้:

<system.web>
  <compilation xdt:Transform="RemoveAttributes(debug)" />
  <authentication>
      <forms xdt:Transform="Replace" timeout="20" requireSSL="true" />
  </authentication>
</system.web>

ด้วยวิธีนี้นักพัฒนาจะไม่ได้รับผลกระทบ (ทำงานใน Debug) และเฉพาะเซิร์ฟเวอร์ที่ได้รับ Release builds เท่านั้นที่ต้องใช้คุกกี้เป็น SSL


^^^ นี่คือวิธีการ ^^^ ข้อมูลเพิ่มเติมอีกครั้ง: การแปลง Web.Config: go.microsoft.com/fwlink/?LinkId=125889
Jeff Mergler

0

ปลอดภัย - คุณลักษณะนี้แจ้งให้เบราว์เซอร์ส่งเฉพาะคุกกี้หากมีการส่งคำขอผ่านช่องทางที่ปลอดภัยเช่น HTTPS วิธีนี้จะช่วยป้องกันคุกกี้จากการถูกส่งผ่านคำขอที่ไม่ได้เข้ารหัส หากแอปพลิเคชันสามารถเข้าถึงได้ผ่านทั้ง HTTP และ HTTPS แสดงว่ามีความเป็นไปได้ที่คุกกี้จะถูกส่งเป็นข้อความที่ชัดเจน


0

ตามคำตอบของ @Mark D ฉันจะใช้การแปลง web.config เพื่อตั้งค่าคุกกี้ต่างๆให้ปลอดภัย ซึ่งรวมถึงการตั้งค่าและanonymousIdentification cookieRequireSSL httpCookies requireSSL

ด้วยเหตุนี้คุณต้องตั้งค่าเว็บของคุณเพื่อปลดการตั้งค่าดังนี้:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.web>
    <httpCookies xdt:Transform="SetAttributes(httpOnlyCookies)" httpOnlyCookies="true" />
    <httpCookies xdt:Transform="SetAttributes(requireSSL)" requireSSL="true" />
    <anonymousIdentification xdt:Transform="SetAttributes(cookieRequireSSL)" cookieRequireSSL="true" /> 
  </system.web>
</configuration>

หากคุณกำลังใช้การรับรองความถูกต้องของบทบาทและแบบฟอร์มด้วยASP.NET Membership Provider(ฉันรู้ว่ามันเก่าแก่) คุณจะต้องตั้งค่าroleManager cookieRequireSSLและforms requireSSLแอตทริบิวต์ให้ปลอดภัยเช่นกัน ถ้าเป็นเช่นนั้น web.release.config ของคุณอาจมีลักษณะเช่นนี้ (รวมอยู่ด้านบนพร้อมกับแท็กใหม่สำหรับ API ความเป็นสมาชิก):

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.web>
    <httpCookies xdt:Transform="SetAttributes(httpOnlyCookies)" httpOnlyCookies="true" />
    <httpCookies xdt:Transform="SetAttributes(requireSSL)" requireSSL="true" />
    <anonymousIdentification xdt:Transform="SetAttributes(cookieRequireSSL)" cookieRequireSSL="true" /> 
    <roleManager xdt:Transform="SetAttributes(cookieRequireSSL)" cookieRequireSSL="true" />
    <authentication>
        <forms xdt:Transform="SetAttributes(requireSSL)" requireSSL="true" />
    </authentication>
  </system.web>
</configuration>

พื้นหลังบน web.config แปลงที่นี่: http://go.microsoft.com/fwlink/?LinkId=125889

เห็นได้ชัดว่าสิ่งนี้นอกเหนือไปจากคำถามเดิมของ OP แต่ถ้าคุณไม่ได้ตั้งค่าทั้งหมดให้ปลอดภัยคุณสามารถคาดหวังว่าเครื่องมือสแกนความปลอดภัยจะสังเกตเห็นและคุณจะเห็นธงสีแดงปรากฏในรายงาน ถามฉันว่าฉันรู้ :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.