Bagaimana saya bisa mengatur bendera Aman pada Cookie Sesi ASP.NET?

146

Bagaimana saya bisa mengatur bendera Aman pada Cookie Sesi ASP.NET, sehingga hanya akan dikirim melalui HTTPS dan tidak pernah melalui HTTP biasa?

Alex
sumber

Jawaban:

127

Ada dua cara, satu httpCookieselemen di web.configmemungkinkan Anda untuk mengaktifkan requireSSLyang hanya mengirimkan semua cookie termasuk sesi di SSL saja dan juga otentikasi dalam bentuk, tetapi jika Anda mengaktifkan SSL pada httpcookies Anda juga harus menyalakannya di dalam konfigurasi formulir juga.

Edit untuk kejelasan: Masukkan ini<system.web>

<httpCookies requireSSL="true" />
Akash Kava
sumber
13
+1 Untuk memperjelas, inilah yang harus Anda tambahkan ke web.config untuk mengatur bendera aman pada cookie auth menjadi true<httpCookies requireSSL="true" />
Tr1stan
8
Perhatikan bahwa ini tergantung pada konfigurasi (level server) Anda. Saya membawa Daerah Uji dengan kesalahan "Aplikasi dikonfigurasikan untuk mengeluarkan cookie aman. Cookie ini membutuhkan browser untuk mengeluarkan permintaan melalui SSL (protokol https). Namun, permintaan saat ini tidak lebih dari SSL." Ini karena kami memiliki proxy terbalik di tempat dan browser terhubung melalui SSL tetapi proxy sebaliknya ke server IIS lebih dari port 80, sehingga aplikasi tidak berpikir itu aman.
mlhDev
4
@Bargitta Kami menangani acara Application_PreSendRequestHeaders dan jika pengaturan aplikasi tertentu benar, kami mengatur semua cookie untuk diamankan. Pengaturan aplikasi ini hanya diatur untuk situs eksternal HTTPS kami.
mlhDev
Begitu, jadi semua situs eksternal Anda akan menggunakan HTTPS, terima kasih.
Bargitta
Saya telah melihat di tempat lain bahwa setelah system.web IIS7 telah digantikan oleh system.webserver, jadi saya mencoba meletakkan pengaturan ini di sana. Pada IIS 8.5 ini menyebabkan kesalahan konfigurasi, tetapi semuanya bekerja jika saya menambahkan bagian system.web ke file konfigurasi dan meletakkan pengaturan di sana.
Eborbob
181

Di <system.web>elemen, tambahkan elemen berikut:

<httpCookies requireSSL="true" />

Namun, jika Anda memiliki <forms>elemen di system.web\authenticationblok Anda , maka ini akan mengesampingkan pengaturan httpCookies, mengaturnya kembali ke default false.

Dalam hal ini, Anda perlu menambahkan requireSSL="true"atribut ke elemen bentuk juga.

Jadi, Anda akan berakhir dengan:

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

Lihat di sini dan di sini untuk dokumentasi MSDN dari elemen-elemen ini.

Martin Eden
sumber
2
Anda dapat menghindari pengaturan web.config lain yang menunggangi pengaturan <httpCookies Anda membutuhkanSSL = "true" /> dengan memasukkan atribut 'lockItem'. Seperti itu: <httpCookies membutuhkanSSL = "true" lockItem = "true" />. Info lebih lanjut di sini dotnetnoob.com/2010/11/how-to-secure-aspnet-cookies.html
JTech
1
Selain itu, jika ada roleManagerelemen, atributnya cookieRequireSSL="true"juga harus disetel ke true. Ref. msdn.microsoft.com/en-us/library/…
Jeff Mergler
dengan menambahkan perubahan di atas pada file terkait, objek sesi tidak berfungsi di aplikasi saya, mereka menjadi nol. bagaimana saya bisa memperbaiki masalah ini?
satya
Apakah Anda menggunakan HTTP atau HTTPS untuk aplikasi Anda? Bendera "aman" yang kami atur di sini mencegah cookie dikirim melalui koneksi yang tidak dienkripsi (yaitu HTTP)
Martin Eden
21

Banyak hal menjadi berantakan dengan cepat jika Anda berbicara tentang kode check-in di lingkungan perusahaan. Kami telah menemukan bahwa pendekatan terbaik adalah memiliki web.Release.config berisi yang berikut:

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

Dengan begitu, pengembang tidak terpengaruh (berjalan di Debug), dan hanya server yang mendapatkan rilis Rilis yang memerlukan cookie untuk menjadi SSL.

Markus D
sumber
^^^ Ini ^^^ adalah caranya. Informasi lebih lanjut: Web.Config mentransformasikan: go.microsoft.com/fwlink/?LinkId=125889
Jeff Mergler
0

secure - Atribut ini memberi tahu browser untuk hanya mengirim cookie jika permintaan dikirim melalui saluran aman seperti HTTPS. Ini akan membantu melindungi cookie agar tidak melewati permintaan yang tidak terenkripsi. Jika aplikasi dapat diakses melalui HTTP dan HTTPS, maka ada kemungkinan cookie dapat dikirim dalam bentuk teks.

Sanjeev Kumar
sumber
0

Berdasarkan jawaban @Mark D, saya akan menggunakan transformasi web.config untuk mengatur semua berbagai cookie menjadi Aman. Ini termasuk pengaturan anonymousIdentification cookieRequireSSLdan httpCookies requireSSL.

Untuk itu Anda akan mengatur web.Release.config Anda sebagai:

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

Jika Anda menggunakan Otentikasi Peran dan Bentuk dengan ASP.NET Membership Provider(Saya tahu, ini kuno), Anda juga ingin mengatur roleManager cookieRequireSSLdan forms requireSSLatributnya sebagai aman juga. Jika demikian, web.release.config Anda mungkin terlihat seperti ini (termasuk di atas ditambah tag baru untuk API keanggotaan):

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

Latar belakang di web.config mentransformasikan di sini: http://go.microsoft.com/fwlink/?LinkId=125889

Jelas ini melampaui pertanyaan asli OP tetapi jika Anda tidak mengatur semuanya agar aman, Anda dapat berharap bahwa alat pemindaian keamanan akan melihat dan Anda akan melihat bendera merah muncul pada laporan. Tanya saya bagaimana saya tahu. :)

Jeff Mergler
sumber