Aroud शोध के बाद, मैं IIS एक्सप्रेस और नियंत्रक वर्ग की OnAuthorization विधि (Ref # 1) के ओवरराइड के साथ इस मुद्दे को हल करने में सक्षम था। मैं हंसेलमैन (रेफ # 2) द्वारा सुझाए गए मार्ग के साथ भी गया हूं। हालाँकि, मैं दो कारणों से इन दो समाधानों से संतुष्ट नहीं था: 1. Ref # 1 का OnAuthorization केवल एक्शन स्तर पर काम करता है, नियंत्रक वर्ग स्तर पर नहीं। 2. Ref # 2 को सेटअप के लिए बहुत अधिक आवश्यकता होती है (Win7 SDK for makecert) ), netsh कमांड्स, और, पोर्ट 80 और पोर्ट 443 का उपयोग करने के लिए, मुझे VS2010 को एडमिनिस्ट्रेटर के रूप में लॉन्च करने की आवश्यकता है, जिसे मैं फॉलो करता हूं।
इसलिए, मैं इस समाधान के साथ आया, जो निम्न स्थितियों के साथ सादगी पर केंद्रित है:
मैं कंट्रोलर क्लास या एक्शन लेवल पर EssentialHttps attbbute का उपयोग करने में सक्षम होना चाहता हूं
मैं चाहता हूँ कि MVC HTTPS का उपयोग तब करना चाहिए जब आवश्यकताएँ विशेषता मौजूद है, और अनुपस्थित होने पर HTTP का उपयोग करें
मैं विजुअल स्टूडियो को व्यवस्थापक के रूप में नहीं चलाना चाहता
मैं किसी भी HTTP और HTTPS पोर्ट का उपयोग करने में सक्षम होना चाहता हूं जो IIS एक्सप्रेस द्वारा असाइन किया गया है (नोट # 1 देखें)
मैं IIS एक्सप्रेस के स्व-हस्ताक्षरित SSL प्रमाणपत्र का पुन: उपयोग कर सकता हूं, और यदि मुझे अवैध SSL प्रॉम्प्ट दिखाई देता है तो मुझे कोई चिंता नहीं है
मैं चाहता हूँ कि देव, परीक्षण और उत्पादन में एक ही कोड आधार और एक ही बाइनरी हो और अतिरिक्त सेटअप से स्वतंत्र हो (जैसे कि netsh, mmc सर्टिफिकेट स्नैप-इन, आदि का उपयोग करके) संभव के रूप में।
अब, जिस तरह से पृष्ठभूमि और स्पष्टीकरण के साथ, मुझे उम्मीद है कि यह कोड किसी को मदद करेगा और कुछ समय बचाएगा। मूल रूप से, एक बेसकंट्रोलर वर्ग बनाएं जो नियंत्रक से विरासत में मिले, और इस बेस क्लास से अपने नियंत्रक वर्गों को प्राप्त करें। जब से आपने इसे पढ़ा है, मैं मानता हूं कि आप जानते हैं कि इन्हें कैसे करना है। तो, खुश कोडिंग!
नोट # 1: यह एक उपयोगी फ़ंक्शन 'getConfig' के उपयोग से प्राप्त किया गया है (कोड देखें)
Ref # 1: http://puredotnetcoder.blogspot.com/2011/09/requirehttps-attribute-in-mvc3.html
Ref # 2: http://www.hanselman.com/blog/WorkingWithSSLAtDevelopmentTimeIsEasierWithIISExpress.aspx
========== बेसकंट्रोलर में कोड ===================
#region Override to reroute to non-SSL port if controller action does not have RequireHttps attribute to save on CPU
// By L. Keng, 2012/08/27
// Note that this code works with RequireHttps at the controller class or action level.
// Credit: Various stackoverflow.com posts and http://puredotnetcoder.blogspot.com/2011/09/requirehttps-attribute-in-mvc3.html
protected override void OnAuthorization(AuthorizationContext filterContext)
{
// if the controller class or the action has RequireHttps attribute
var requireHttps = (filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(RequireHttpsAttribute), true).Count() > 0
|| filterContext.ActionDescriptor.GetCustomAttributes(typeof(RequireHttpsAttribute), true).Count() > 0);
if (Request.IsSecureConnection)
{
// If request has a secure connection but we don't need SSL, and we are not on a child action
if (!requireHttps && !filterContext.IsChildAction)
{
var uriBuilder = new UriBuilder(Request.Url)
{
Scheme = "http",
Port = int.Parse(getConfig("HttpPort", "80")) // grab from config; default to port 80
};
filterContext.Result = this.Redirect(uriBuilder.Uri.AbsoluteUri);
}
}
else
{
// If request does not have a secure connection but we need SSL, and we are not on a child action
if (requireHttps && !filterContext.IsChildAction)
{
var uriBuilder = new UriBuilder(Request.Url)
{
Scheme = "https",
Port = int.Parse(getConfig("HttpsPort", "443")) // grab from config; default to port 443
};
filterContext.Result = this.Redirect(uriBuilder.Uri.AbsoluteUri);
}
}
base.OnAuthorization(filterContext);
}
#endregion
// a useful helper function to get appSettings value; allow caller to specify a default value if one cannot be found
internal static string getConfig(string name, string defaultValue = null)
{
var val = System.Configuration.ConfigurationManager.AppSettings[name];
return (val == null ? defaultValue : val);
}
============== अंत कोड ================
Web.Release.Config में, HttpPort और HttpsPort को साफ़ करने के लिए निम्नलिखित जोड़ें (डिफ़ॉल्ट 80 और 443 का उपयोग करने के लिए)।
<appSettings>
<add key="HttpPort" value="" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
<add key="HttpsPort" value="" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>