Saya ingin menggunakan RequireHttpsAttribute untuk mencegah permintaan HTTP yang tidak aman dikirim ke metode tindakan.
C #
[RequireHttps] //apply to all actions in controller
public class SomeController
{
[RequireHttps] //apply to this action only
public ActionResult SomeAction()
{
...
}
}
VB
<RequireHttps()> _
Public Class SomeController
<RequireHttps()> _
Public Function SomeAction() As ActionResult
...
End Function
End Class
Sayangnya, Server Pengembangan ASP.NET tidak mendukung HTTPS.
Bagaimana cara membuat aplikasi ASP.NET MVC saya menggunakan RequireHttps saat diterbitkan ke lingkungan produksi, tetapi tidak saat dijalankan di workstation pengembangan saya di Server Pengembangan ASP.NET?
asp.net-mvc
visual-studio
ssl
https
Zack Peterson
sumber
sumber
Jawaban:
Ini tidak akan membantu jika Anda menjalankan Rilis build pada workstation pengembangan Anda, tetapi kompilasi bersyarat dapat melakukan pekerjaan itu ...
Memperbarui
Dalam Visual Basic, atribut secara teknis merupakan bagian dari baris yang sama dengan definisi yang mereka terapkan. Anda tidak bisa meletakkan pernyataan kompilasi bersyarat di dalam baris, jadi Anda dipaksa untuk menulis deklarasi fungsi dua kali - sekali dengan atribut, dan sekali tanpa. Itu berhasil, jika Anda tidak keberatan dengan keburukannya.
Perbarui 2
Beberapa orang telah menyebutkan berasal dari
RequireHttpsAttribute
tanpa memberikan contoh, jadi inilah satu untuk Anda. Saya pikir pendekatan ini akan jauh lebih bersih daripada pendekatan kompilasi bersyarat, dan itu akan menjadi preferensi saya pada posisi Anda.DISCLAIMER: Saya belum menguji kode ini, bahkan sedikit, dan VB saya cukup berkarat. Yang saya tahu adalah bahwa itu terkompilasi. Saya menulisnya berdasarkan saran dari spot, queen3, dan Lance Fisher. Jika tidak berhasil, setidaknya itu harus menyampaikan gagasan umum, dan memberi Anda titik awal.
Pada dasarnya, atribut baru keluar begitu saja alih-alih menjalankan kode otorisasi SSL default, jika permintaan saat ini bersifat lokal (yaitu, Anda mengakses situs melalui localhost). Anda bisa menggunakannya seperti ini:
Jauh lebih bersih! Asalkan kode saya yang belum diuji benar-benar berfungsi.
sumber
Jika ada yang membutuhkan versi C #:
sumber
filters.Add(new MyRequireHttpsAttribute ());
diFilterConfig
?Berasal dari RequireHttps adalah pendekatan yang baik.
Untuk mengatasi masalah sepenuhnya, Anda dapat menggunakan IIS di komputer lokal Anda dengan sertifikat yang ditandatangani sendiri juga. IIS lebih cepat daripada server web internal, dan Anda memiliki keuntungan bahwa lingkungan pengembangan Anda lebih seperti produksi.
Scott Hanselman memiliki sumber daya yang bagus tentang beberapa cara untuk mengimplementasikan HTTPS lokal dengan VS2010 dan IIS Express.
sumber
Memanfaatkan sistem filter MVC dan Global.asax.cs, saya berasumsi Anda bisa melakukan ini ...
sumber
Karena ASP.Net Development Server yang menyebabkan masalah Anda di tempat pertama, perlu dicatat bahwa Microsoft sekarang memiliki IIS Express , yang dikirimkan dengan Visual Studio (sejak VS2010 SP1). Ini adalah versi cut-down IIS yang mudah digunakan seperti Development Server, tetapi mendukung set fitur lengkap IIS 7.5 termasuk SSL.
Scott Hanselman memiliki postingan terperinci tentang bekerja dengan SSL di IIS Express .
sumber
Bagaimana dengan mewarisi atribut RequireHttps dalam atribut khusus. Kemudian, di dalam atribut khusus Anda, periksa properti IsLocal dari permintaan saat ini untuk melihat apakah permintaan tersebut berasal dari mesin lokal. Jika ya, maka jangan terapkan fungsionalitas dasar. Jika tidak, panggil operasi basis.
sumber
Ini berhasil untuk saya, MVC 6 (ASP.NET Core 1.0) . Kode memeriksa apakah debug sedang dalam pengembangan, dan jika tidak, ssl tidak diperlukan. Semua pengeditan ada di Startup.cs .
Menambahkan:
Menambahkan:
Edit:
sumber
Jika Anda dapat memperoleh dan menimpa - lakukanlah. Jika Anda tidak bisa - MVC dilengkapi dengan sumber, ambil saja sumbernya dan buat atribut [ForceHttps] Anda sendiri yang memeriksa IsLocal.
sumber
Untuk MVC 3 saya menambahkan FilterProvider saya sendiri (berdasarkan kode yang ditemukan di sini: Filter Global dan Bersyarat yang, antara lain (menampilkan info Debug untuk pengguna lokal, dll.) Akan menghiasi semua tindakan dengan
RequireHttpsAttribute
kapanHttpContext.Request.IsLocal == false
.sumber
Setelah meneliti dengan keras, saya dapat memecahkan masalah ini dengan IIS Express dan menimpa metode OnAuthorization kelas Controller (Ref # 1). Saya juga telah mengikuti rute yang direkomendasikan oleh Hanselman (Referensi # 2). Namun, saya tidak sepenuhnya puas dengan dua solusi ini karena dua alasan: 1. OnAuthorization Ref # 1 hanya bekerja pada level tindakan, bukan pada level kelas controller 2. Ref # 2 membutuhkan banyak pengaturan (Win7 SDK untuk makecert ), perintah netsh, dan, untuk menggunakan port 80 dan port 443, saya perlu meluncurkan VS2010 sebagai administrator, yang tidak saya sukai.
Jadi, saya menemukan solusi ini yang berfokus pada kesederhanaan dengan kondisi berikut:
Saya ingin dapat menggunakan attbbute RequireHttps di kelas Controller atau tingkat tindakan
Saya ingin MVC menggunakan HTTPS ketika atribut RequireHttps ada, dan menggunakan HTTP jika tidak ada
Saya tidak ingin menjalankan Visual Studio sebagai administrator
Saya ingin dapat menggunakan port HTTP dan HTTPS apa pun yang ditetapkan oleh IIS Express (Lihat Catatan # 1)
Saya dapat menggunakan kembali sertifikat SSL yang ditandatangani sendiri dari IIS Express, dan saya tidak peduli jika saya melihat prompt SSL yang tidak valid
Saya ingin dev, test, dan produksi memiliki basis kode yang sama persis dan biner yang sama dan independen dari pengaturan tambahan (misalnya menggunakan netsh, mmc cert snap-in, dll.) Sebanyak mungkin
Sekarang, dengan latar belakang dan penjelasannya, saya harap kode ini akan membantu seseorang dan menghemat waktu. Pada dasarnya, buat kelas BaseController yang diturunkan dari Controller, dan turunkan kelas kontroler Anda dari kelas dasar ini. Karena Anda telah membaca sejauh ini, saya berasumsi bahwa Anda tahu cara melakukannya. Selamat membuat kode!
Catatan # 1: Ini dicapai dengan menggunakan fungsi 'getConfig' yang berguna (lihat kode)
Referensi # 1: http://puredotnetcoder.blogspot.com/2011/09/requirehttps-attribute-in-mvc3.html
Ref # 2: http://www.hanselman.com/blog/WorkingWithSSLAtDevelopmentTimeIsEasierWithIISExpress.aspx
========== Kode di BaseController ===================
============== kode akhir ================
Di Web.Release.Config, tambahkan berikut ini untuk membersihkan HttpPort dan HttpsPort (untuk menggunakan default 80 dan 443).
sumber
Satu solusi yang dapat Anda gunakan pada produksi dan juga pada workstation pengembangan. Ini berdasarkan pilihan Anda dari pengaturan aplikasi di web.config
Jika Anda tidak ingin menggunakan SSL, hapus kuncinya. Jika Anda menggunakan SSL standar port 443, hapus nilainya atau tentukan 443.
Kemudian gunakan implementasi kustom RequireHttpsAttribute yang menangani kondisi Anda. Ini sebenarnya diturunkan dari RequireHttps dan menggunakan implementasi yang sama dari metode dasar kecuali untuk menambahkan kondisi.
Jangan lupa untuk menghias metode LogOn di AccountController
dan sesuatu seperti ini di Tampilan Logon Anda untuk mengirim formulir melalui https.
sumber
Seperti yang disebutkan Joel, Anda dapat mengubah kompilasi dengan menggunakan
#if !DEBUG
direktif.Saya baru tahu bahwa Anda dapat mengubah nilai simbol DEBUG di elemen kompilasi file web.config. Semoga membantu.
sumber
MVC 6 (ASP.NET Core 1.0):
Solusi yang tepat adalah menggunakan env.IsProduction () atau env.IsDevelopment (). Baca lebih lanjut tentang alasan di balik jawaban ini tentang cara membutuhkan https hanya dalam produksi .
Jawaban ringkas di bawah (lihat tautan di atas untuk membaca lebih lanjut tentang keputusan desain) untuk 2 gaya berbeda:
Startup.cs (filter register):
BaseController.cs (gaya atribut):
RequireHttpsInProductionAttribute : Keduanya menggunakan atribut khusus yang diturunkan dari RequireHttpsAttribute :
sumber
Ini adalah cara terbersih bagiku. Di
App_Start\FilterConfig.cs
file saya . Tidak dapat menjalankan rilis build lagi.Sebagai alternatif, Anda dapat mengaturnya untuk hanya meminta https saat halaman kesalahan kustom Anda aktif.
sumber
Silakan merujuk ke posting ini oleh Rick Anderson di RickAndMSFT tentang Azure & MVC Mengisi Celah Azure
http://blogs.msdn.com/b/rickandy/archive/2011/04/22/better-faster-easier-ssl-testing-for-asp-net-mvc-amp-webforms.aspx
sumber