2008-09-05 12 views
148

लगभग 6 महीने पहले मैंने एक ऐसी साइट बनाई जहां हर अनुरोध को https से अधिक होने की आवश्यकता थी। उस समय एकमात्र तरीका यह सुनिश्चित करने के लिए मिल सकता था कि किसी पृष्ठ पर प्रत्येक अनुरोध https से अधिक था, पृष्ठ लोड ईवेंट में इसे जांचना था। अगर अनुरोध http से अधिक नहीं था, तो मैं प्रतिक्रिया करता हूं। प्रतिक्रिया (https://example.com ")एएसपीनेट में पूरी साइट के लिए https को मजबूर करने का सबसे अच्छा तरीका?

क्या कोई बेहतर तरीका है - आदर्श रूप से web.config में कुछ सेटिंग?

+0

जांच यहाँ http://stackoverflow.com/questions/33882350/iis-8-redirect-url-from-http-to-https/33882351#33882351 –

उत्तर

182

से http://www.hanselman.com/blog/HowToEnableHTTPStrictTransportSecurityHSTSInIIS7.aspx

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <rewrite> 
      <rules> 
       <rule name="HTTP to HTTPS redirect" stopProcessing="true"> 
        <match url="(.*)" /> 
        <conditions> 
         <add input="{HTTPS}" pattern="off" ignoreCase="true" /> 
        </conditions> 
        <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" 
         redirectType="Permanent" /> 
       </rule> 
      </rules> 
      <outboundRules> 
       <rule name="Add Strict-Transport-Security when HTTPS" enabled="true"> 
        <match serverVariable="RESPONSE_Strict_Transport_Security" 
         pattern=".*" /> 
        <conditions> 
         <add input="{HTTPS}" pattern="on" ignoreCase="true" /> 
        </conditions> 
        <action type="Rewrite" value="max-age=31536000" /> 
       </rule> 
      </outboundRules> 
     </rewrite> 
    </system.webServer> 
</configuration> 

मूल उत्तर HSTS

का उपयोग करें

मूल रूप से

protected void Application_BeginRequest(Object sender, EventArgs e) 
{ 
    if (HttpContext.Current.Request.IsSecureConnection.Equals(false) && HttpContext.Current.Request.IsLocal.Equals(false)) 
    { 
    Response.Redirect("https://" + Request.ServerVariables["HTTP_HOST"] 
+ HttpContext.Current.Request.RawUrl); 
    } 
} 

कि global.asax.cs में या जाना होगा (वैश्विक। asax.vb)

मुझे नहीं एक तरह से web.config

+5

यह काम करता है जवाब मेरे , लेकिन यह मेरे लिए खतरनाक था: जब मैंने इस कोड के साथ वीएस 2010 में स्थानीय रूप से चलाने का प्रयास किया, तो मेरा प्रारंभ पृष्ठ कभी लोड नहीं हुआ; इसके बजाय, मुझे अभी "यह वेबपृष्ठ उपलब्ध नहीं है" संदेश प्राप्त हुआ। ठीक करने के लिए, मैंने परीक्षण करने के लिए दूसरी शर्त जोड़ा है कि यूआरएल में स्ट्रिंग "लोकलहोस्ट" है: यदि ऐसा नहीं होता है, तो https को मजबूर करें। – mg1075

+1

यह मुझे एक रीडायरेक्ट लूप दे रहा है। कोड जोड़ने से पहले यह ठीक काम किया।कोई सुझाव? – Joe

+0

+1, यह दो बार सर्वर पर रीडायरेक्ट कर रहा है? सबसे पहले, जब आप स्पष्ट रूप से रीडायरेक्ट कर रहे हैं और दूसरा, जब आप Global.asax में रीडायरेक्ट कर रहे हैं? – Pankaj

11

आप जो भी कारण के लिए IIS में सेट अप करने में असमर्थ हैं, मुझे लगता है कि आप के लिए पुन: निर्देशन करता है एक HTTP मॉड्यूल बनाने चाहते हैं में यह निर्दिष्ट करने के लिए के बारे में पता:

using System; 
using System.Web; 

namespace HttpsOnly 
{ 
    /// <summary> 
    /// Redirects the Request to HTTPS if it comes in on an insecure channel. 
    /// </summary> 
    public class HttpsOnlyModule : IHttpModule 
    { 
     public void Init(HttpApplication app) 
     { 
      // Note we cannot trust IsSecureConnection when 
      // in a webfarm, because usually only the load balancer 
      // will come in on a secure port the request will be then 
      // internally redirected to local machine on a specified port. 

      // Move this to a config file, if your behind a farm, 
      // set this to the local port used internally. 
      int specialPort = 443; 

      if (!app.Context.Request.IsSecureConnection 
       || app.Context.Request.Url.Port != specialPort) 
      { 
       app.Context.Response.Redirect("https://" 
        + app.Context.Request.ServerVariables["HTTP_HOST"] 
        + app.Context.Request.RawUrl);  
      } 
     } 

     public void Dispose() 
     { 
      // Needed for IHttpModule 
     } 
    } 
} 

तो बस, एक DLL के लिए यह संकलन अपनी परियोजना के लिए एक संदर्भ के रूप में जोड़ने और web.config में रखें:

<httpModules> 
     <add name="HttpsOnlyModule" type="HttpsOnly.HttpsOnlyModule, HttpsOnly" /> 
</httpModules> 
+0

यह ग्लोबल.एक्सएक्स में बस चिपकने से ज्यादा शामिल है - बस उत्सुक है, क्या कोई फायदा है? –

+1

लाभ होगा, जब आप इसका उपयोग नहीं करना चाहते हैं, तो बस अपने web.config में मॉड्यूल पर टिप्पणी करें। यह समाधान * विन्यास योग्य है, जबकि दूसरा नहीं है। –

+2

मैं थोड़ा उलझन में हूँ। मुझे 'ऐप 'विधि में' ऐप 'बीगिनरक्वेट + = नया ऑनबिनरक्व्वेस्ट;' की अपेक्षा की जाएगी और 'ऑनबीजिन रिवेस्ट' में 'मौजूदा' विधि में क्या होगा। क्या आप वाकई उम्मीद करते हैं कि यह मॉड्यूल अपेक्षित काम करता है? –

79

IIS7 मॉड्यूल आप अनुप्रेषित करने देगा।

<rewrite> 
     <rules> 
      <rule name="Redirect HTTP to HTTPS" stopProcessing="true"> 
       <match url="(.*)"/> 
       <conditions> 
        <add input="{HTTPS}" pattern="^OFF$"/> 
       </conditions> 
       <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="SeeOther"/> 
      </rule> 
     </rules> 
    </rewrite> 
+34

यह सोचने के लिए '' के अंदर जाता है। – Chris

+9

इसके अलावा, आईआईएस 7.0 के लिए, आपको यूआरएल रिवाइट मॉड्यूल 2.0 – Chris

+0

इंस्टॉल करने की आवश्यकता है, अगर हमें इसे एक पृष्ठ के लिए काम करने की आवश्यकता है तो क्या होगा? –

-1

अगर आप केवल global.asax.cs में यह प्रदान करते हैं http मॉड्यूल करने में एक और लाभ यह है, यह केवल Application_BeginRequest, जो आपके ऐप्लिकेशन को पूरी तरह से सुरक्षित नहीं है इसका मतलब है पर एसएसएल की जाँच करता है; यह केवल एसएसएल संस्करण को पहली कोशिश के लिए रूट करेगा, फिर उपयोगकर्ता किसी भी एसएसएल यूआरएल को काट और पेस्ट कर सकता है और इसे बाईपास कर सकता है।

+10

हाय हारून, ऐसा कोई नहीं है, क्योंकि Application_BeginRequest प्रत्येक अनुरोध पर चलता है , इसलिए यदि उपयोगकर्ता अपने ब्राउज़र में http में बदल जाता है, तो अगली बार जब वे सर्वर – JonoW

1

यह वेब मक्स के लिए आपके बैलेंसर के ब्रांड पर भी निर्भर करता है, आपको आने वाले ट्रैफ़िक एसएसएल को समझने के लिए http हेडर X-WebMux-SSL-termination: true की आवश्यकता होगी। विवरण यहां: http://www.cainetworks.com/support/redirect2ssl.html

101

दूसरी चीज जो आप कर सकते हैं वह है HSTS ब्राउज़र पर "सख्त-परिवहन-सुरक्षा" शीर्षलेख लौटकर। ब्राउजर को इसका समर्थन करना है (और वर्तमान में, यह मुख्य रूप से क्रोम और फ़ायरफ़ॉक्स है), लेकिन इसका मतलब है कि एक बार सेट हो जाने पर, ब्राउज़र HTTP पर साइट पर अनुरोध नहीं करेगा और इसके बजाय उन्हें जारी करने से पहले उन्हें HTTPS अनुरोधों में अनुवाद करेगा । HTTP से रीडायरेक्ट के साथ संयोजन में इस प्रयास करें:

protected void Application_BeginRequest(Object sender, EventArgs e) 
{ 
    switch (Request.Url.Scheme) 
    { 
    case "https": 
     Response.AddHeader("Strict-Transport-Security", "max-age=300"); 
     break; 
    case "http": 
     var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery; 
     Response.Status = "301 Moved Permanently"; 
     Response.AddHeader("Location", path); 
     break; 
    } 
} 

जो ब्राउज़र के बारे में पता बस हैडर पर ध्यान नहीं देगा HSTS नहीं कर रहे हैं, लेकिन अभी भी स्विच बयान से पकड़ा और HTTPS के लिए खत्म भेजे जाएंगे।

+4

पर हिट करते हैं तो वे https पर रीडायरेक्ट हो जाएंगे, पहले कभी भी एचएसटीएस हेडर के बारे में नहीं सुना, लेकिन बहुत अच्छा लग रहा है। क्या इस तरह के एक छोटे से अधिकतम आयु मूल्य (5 मिनट) का उपयोग करने का कोई कारण है? आपके द्वारा लिंक किया गया विकिपीडिया लेख इसे एक बड़े मूल्य (6-12 महीने) पर सेट करने का सुझाव देता है। – dana

+5

+1। ट्रॉय के ब्लॉग पर इस बहुत व्यापक लेख को देखें जिसमें केवल रीडायरेक्ट का उपयोग करने से सुरक्षा कम हो सकती है। संकेत: यह आपको अन्य चीजों के साथ एसएसएल स्ट्रिप टूल के लिए कमजोर छोड़ सकता है। http://www.troyhunt.com/2011/11/owasp-top-10-for-net-developers-part-9.html –

+2

[NWebsec] की जांच करने के लायक भी (https://nwebsec.codeplex.com/), जो यह (और अधिक) बहुत आसान बनाता है। –

0

@Joe के लिए ऊपर, "यह मेरे एक रीडायरेक्ट लूप दे रहा है इससे पहले कि मैं कोड यह ठीक काम किया जोड़ा कोई सुझाव -।।? जो नवंबर 8 '11 4:13 पर"

यह मेरे लिए हो रहा था साथ ही और मुझे विश्वास है कि क्या हो रहा था यह है कि वेब सर्वर के सामने SSL अनुरोध को समाप्त करने वाला लोड बैलेंसर था। इसलिए, मेरी वेबसाइट हमेशा यह सोच रही थी कि अनुरोध "http" था, भले ही मूल ब्राउज़र ने इसे "https" होने का अनुरोध किया हो।

मैं मानता हूं कि यह थोड़ा हैकी है, लेकिन मेरे लिए जो काम किया गया वह "जस्ट रेडियोधर्मी" संपत्ति को लागू करना था जिसे मैं समझाने के लिए लीवरेज कर सकता था कि उस व्यक्ति को पहले से ही पुनर्निर्देशित किया गया था। इसलिए, मैं उन विशिष्ट स्थितियों के लिए परीक्षण करता हूं जो पुनर्निर्देशन की गारंटी देते हैं और यदि वे मुलाकात की जाती हैं, तो मैंने पुनर्निर्देशन से पहले इस संपत्ति (सत्र में संग्रहीत मूल्य) सेट किया है। भले ही पुनर्निर्देशन के लिए http/https स्थितियां दूसरी बार मिलें, फिर भी मैं पुनर्निर्देशन तर्क को बाईपास करता हूं और "JustRedirected" सत्र मान को गलत पर रीसेट करता हूं। आप अपनी खुद की सशर्त परीक्षण तर्क की आवश्यकता होगी, लेकिन यहां संपत्ति का एक सरल कार्यान्वयन है:

public bool JustRedirected 
    { 
     get 
     { 
      if (Session[RosadaConst.JUSTREDIRECTED] == null) 
       return false; 

      return (bool)Session[RosadaConst.JUSTREDIRECTED]; 
     } 
     set 
     { 
      Session[RosadaConst.JUSTREDIRECTED] = value; 
     } 
    } 
1

तो एसएसएल समर्थन अपनी साइट में कॉन्फ़िगर करने योग्य नहीं है (। यानी/बंद https चालू करने के लिए सक्षम होना चाहिए) - आप किसी भी नियंत्रक/नियंत्रक कार्रवाई पर [RequHttps] विशेषता का उपयोग कर सकते हैं जिसे आप सुरक्षित करना चाहते हैं।

3

आपको क्या करने की जरूरत है:

1) की तरह उत्पादन या मंच सर्वर पर निर्भर करता है web.config के अंदर एक कुंजी जोड़ें,

नीचे
<add key="HttpsServer" value="stage"/> 
      or 
<add key="HttpsServer" value="prod"/> 

2) अपने Global.asax फ़ाइल के अंदर नीचे विधि जोड़ें।

void Application_BeginRequest(Object sender, EventArgs e) 
{ 
    //if (ConfigurationManager.AppSettings["HttpsServer"].ToString() == "prod") 
    if (ConfigurationManager.AppSettings["HttpsServer"].ToString() == "stage") 
    { 
     if (!HttpContext.Current.Request.IsSecureConnection) 
     { 
      if (!Request.Url.GetLeftPart(UriPartial.Authority).Contains("www")) 
      { 
       HttpContext.Current.Response.Redirect(
        Request.Url.GetLeftPart(UriPartial.Authority).Replace("http://", "https://www."), true); 
      } 
      else 
      { 
       HttpContext.Current.Response.Redirect(
        Request.Url.GetLeftPart(UriPartial.Authority).Replace("http://", "https://"), true); 
      } 
     } 
    } 
} 
17

एएसपी.नेट एमवीसी का उपयोग करने वालों के लिए। आप दो तरह से पूरी साइट से अधिक HTTPS पर SSL/TLS मजबूर करने के लिए निम्न का उपयोग कर सकते हैं:

मुश्किल रास्ता

1 - वैश्विक फिल्टर करने के लिए RequireHttpsAttribute जोड़ें:

GlobalFilters.Filters.Add(new RequireHttpsAttribute()); 

- 2 सेना विरोधी जालसाजी SSL/TLS उपयोग करने के लिए टोकन:

AntiForgeryConfig.RequireSsl = true; 

3 - कुकी की आवश्यकता होती बदलकर डिफ़ॉल्ट रूप से HTTPS की आवश्यकता होती है Web.config फ़ाइल:

<system.web> 
    <httpCookies httpOnlyCookies="true" requireSSL="true" /> 
</system.web> 

4 - NWebSec.Owin NuGet पैकेज का प्रयोग करें और साइट करवाते सख्त परिवहन सुरक्षा को सक्षम करने के कोड की निम्न पंक्ति जोड़ें। नीचे प्रीलोड निर्देश जोड़ने के लिए मत भूलना और अपनी साइट HSTS Preload site पर सबमिट करें। अधिक जानकारी here और here। ध्यान दें कि यदि आप ओविन का उपयोग नहीं कर रहे हैं, तो एक वेब.कॉन्फिग विधि है जिसे आप NWebSec साइट पर पढ़ सकते हैं।

// app is your OWIN IAppBuilder app in Startup.cs 
app.UseHsts(options => options.MaxAge(days: 30).Preload()); 

5 - साइट भर में सार्वजनिक कुंजी लगाए (HPKP) सक्षम करने के लिए NWebSec.Owin NuGet पैकेज का प्रयोग करें और कोड की निम्न पंक्ति जोड़ें। अधिक जानकारी here और here

// app is your OWIN IAppBuilder app in Startup.cs 
app.UseHpkp(options => options 
    .Sha256Pins(
     "Base64 encoded SHA-256 hash of your first certificate e.g. cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=", 
     "Base64 encoded SHA-256 hash of your second backup certificate e.g. M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE=") 
    .MaxAge(days: 30)); 

6 - किसी भी यूआरएल के इस्तेमाल में https योजना शामिल करें। Content Security Policy (CSP) HTTP शीर्षलेख और Subresource Integrity (SRI) कुछ ब्राउज़रों में इस योजना को अनुकरण करते समय अच्छा न खेलें। एचटीटीपीएस के बारे में स्पष्ट होना बेहतर है। जैसे

<script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js"></script> 

आसान तरीका

उपयोग ASP.NET MVC Boilerplate दृश्य स्टूडियो परियोजना टेम्पलेट और में बनाया गया यह सब भी बहुत कुछ के साथ एक परियोजना उत्पन्न करने के लिए। तुम भी GitHub पर कोड देख सकते हैं।

+3

यदि आपके पास '<प्रमाणीकरण मोड =" फॉर्म "> 'का उपयोग करना है, तो आपके अंदर'

' – Pluto

+1

@ मुहम्मद-रेहान-सईद ​​होना चाहिए, मैं mvc5 बॉयलरप्लेट का उपयोग कर रहा हूं लेकिन साइट http को https पर रीडायरेक्ट नहीं करती है स्वचालित रूप से उत्पादन सर्वर पर यह केवल स्थानीयहोस्ट पर ऐसा कुछ है जो मुझे याद आ रही है? – Diin

+0

यह सवाल पूछने के लिए यह सही मंच नहीं है। गिटहब साइट पर कोई समस्या पोस्ट करें। '' 'RequHttpsAttribute''' रीडायरेक्ट करता है। जब तक आपके पास यह ठीक है तो यह ठीक होना चाहिए। –

0

मैं अपने दो सेंट फेंकने जा रहा हूं। आईएफ आपके पास आईआईएस सर्वर की ओर पहुंच है, तो आप प्रोटोकॉल बाइंडिंग के उपयोग से HTTPS को मजबूर कर सकते हैं। उदाहरण के लिए, आपके पास ब्ला नामक वेबसाइट है। आईआईएस में आप दो साइट्स सेट करेंगे: ब्ला, और ब्लाह (रीडायरेक्ट)ब्ला केवल HTTPS बाध्यकारी (और FTP को कॉन्फ़िगर करें यदि आपको आवश्यकता है, तो इसे सुरक्षित कनेक्शन पर भी मजबूर करना सुनिश्चित करें)। ब्लाह (रीडायरेक्ट) केवल HTTP बाइंडिंग को कॉन्फ़िगर करें। अंत में, HTTP रीडायरेक्टब्लैह (रीडायरेक्ट) के लिए अनुभाग सटीक गंतव्य सक्षम के साथ 301 रीडायरेक्ट https://blah.com पर सेट करना सुनिश्चित करें। सुनिश्चित करें कि आईआईएस में प्रत्येक साइट अपने रूट फ़ोल्डर को इंगित कर रही है अन्यथा Web.config सभी खराब हो जाएंगे। यह भी सुनिश्चित करें कि HSTS आपकी HTTPSed साइट पर कॉन्फ़िगर किया गया है ताकि ब्राउजर द्वारा बाद के अनुरोध हमेशा HTTPS पर मजबूर हो जाएं और कोई रीडायरेक्ट नहीं होता है।

0

-> बस सार्वजनिक कक्षा होमकंट्रोलर: नियंत्रक के शीर्ष पर [RequHttps] जोड़ें।

-> और ग्लोबल फ़िल्टरर्स जोड़ें। फ़िल्टर जोड़ें (नया RequHttpsAttribute()); Global.asax.cs फ़ाइल में 'संरक्षित शून्य अनुप्रयोग_स्टार्ट()' विधि में।

जो आपके पूरे एप्लिकेशन को HTTPS पर मजबूर करता है।

+0

मुझे विश्वास नहीं है कि यह वेबफॉर्म या वेबएपीआई के साथ बनाए गए किसी भी एपीआई का उपयोग करके किए गए किसी भी पेज के लिए काम करेगा। यह केवल एमवीसी नियंत्रकों को कवर करेगा। –

+0

हां, आप सही हैं केवल यह एएसपी.NET एमवीसी में काम करते हैं –

1

यह @ ट्रॉय हंट के आधार पर एक पूर्ण उत्तर है। Global.asax.cs में अपने WebApplication वर्ग को यह समारोह जोड़ें:

protected void Application_BeginRequest(Object sender, EventArgs e) 
    { 
     // Allow https pages in debugging 
     if (Request.IsLocal) 
     { 
      if (Request.Url.Scheme == "http") 
      { 
       int localSslPort = 44362; // Your local IIS port for HTTPS 

       var path = "https://" + Request.Url.Host + ":" + localSslPort + Request.Url.PathAndQuery; 

       Response.Status = "301 Moved Permanently"; 
       Response.AddHeader("Location", path); 
      } 
     } 
     else 
     { 
      switch (Request.Url.Scheme) 
      { 
       case "https": 
        Response.AddHeader("Strict-Transport-Security", "max-age=31536000"); 
        break; 
       case "http": 
        var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery; 
        Response.Status = "301 Moved Permanently"; 
        Response.AddHeader("Location", path); 
        break; 
      } 
     } 
    } 

(परियोजना के लिए गुण गोदी में सक्षम अपने स्थानीय निर्माण पर SSL सक्षम करने के लिए)

0

आप ASP.NET कोर का उपयोग कर रहे हैं, तो आप की कोशिश कर सकते nuget पैकेज से बाहर SaidOut.AspNetCore.HttpsWithStrictTransportSecurity।

तो फिर तुम केवल

app.UseHttpsWithHsts(HttpsMode.AllowedRedirectForGet, configureRoutes: routeAction); 

जोड़ने के लिए यह भी सभी अनुरोध करने के लिए HTTP StrictTransportSecurity हेडर जोड़ देगा बनाया https योजना का उपयोग कर की जरूरत है।

उदाहरण कोड और प्रलेखन https://github.com/saidout/saidout-aspnetcore-httpswithstricttransportsecurity#example-code

संबंधित मुद्दे