2010-06-19 17 views
11

मैं क्या ASP.NET MVC में एक साधारण लॉगऑन प्रपत्र होना चाहिए के साथ एक समस्या का सामना कर रहा हूँ 2. अनिवार्य रूप से मेरी फार्म इस तरह एक छोटे से कुछ लग रहा है मैं लॉगऑन क्रिया विधि पर एक RequiresHTTPS फिल्टर है, लेकिन जब वह निष्पादित मैं निम्न संदेशASP.NET MVC HTML.BeginForm और एसएसएल

प्राप्त अनुरोध किया गया संसाधन केवल SSL के माध्यम से पहुँचा जा सकता है

,210

इस बिंदु एकमात्र समाधान है कि काम पर एक अतिरिक्त कार्रवाई htmlattribute में पारित करने के लिए इस प्रकार थी:

var actionURL = "https://" + Request.Url.Host + Request.Url.PathAndQuery; 
using (Html.BeginForm("LogOn", "Account", new { area = "Buyers" }, FormMethod.Post, new { ID = "buyersLogOnForm", @action = actionURL })) 

हालांकि यह काम करता है मुझे आश्चर्य है कि एक) मैं क्यों पहली जगह में इस मुद्दे को देख रहा हूँ और ख) अगर वहाँ http पृष्ठ से https पर पोस्ट करने का एक और सीधा तरीका है?

[संपादित करें]

मैं ने कहा है चाहिए कि लॉगऑन लटकती कई सार्वजनिक पृष्ठों पर उपलब्ध हो जाएगा। मैं नहीं चाहता कि मेरे सभी पेज HTTPS हों। उदाहरण के लिए, मेरा आशा पृष्ठ - जो कोई भी देख सकता है - HTTPS आधारित नहीं होना चाहिए। अनिवार्य रूप से मुझे अपने फॉर्म में प्रोटोकॉल निर्दिष्ट करने की आवश्यकता है, लेकिन यह नहीं पता कि यह कैसे करना है, या यदि यह संभव है।

मैं किसी भी सलाह/सुझाव की सराहना करता हूं। अग्रिम

जेपी

उत्तर

11

आप इस्तेमाल कर सकते हैं

<form action =" <%= Url.Action(
"action", 
"controller", 
ViewContext.RouteData.Values, 
"https" 
) %>" method="post" > 
+2

इसके साथ समस्या यह है कि आपके फॉर्म के लिए कोई फॉर्म कॉन्टेक्स्ट नहीं बनाया गया है, इसलिए सभी एचटीएमएल इनपुट हेल्पर्स आपके दृश्य मॉडल से जुड़े सत्यापन विशेषताओं को जोड़ नहीं पाएंगे ... –

+0

ब्रैड जे द्वारा नीचे दिए गए उत्तर को देखें। यह सुरक्षित नहीं है! – Null

6

उपयोग दोनों कार्रवाई पर [RequireHttps] विशेषता है कि फार्म और एक आप पोस्ट कर रहे renders धन्यवाद।

+1

लॉगऑन लटकती कई सार्वजनिक पृष्ठों पर उपलब्ध हो जाएगा। मैं नहीं चाहता कि मेरे सभी पेज HTTPS हों। उदाहरण के लिए, मेरा आशा पृष्ठ - जो कोई भी देख सकता है - एचटीटीपीएस आधारित नहीं होना चाहिए –

+3

उपयोगकर्ता लॉगिन पृष्ठ पर अपना उपयोगकर्ता नाम और पासवर्ड दर्ज करने के लिए असंतुष्ट हो सकते हैं जिस पर पैडलॉक उनके ब्राउज़र में दिखाई नहीं दे रहा है। इसे लॉगऑन पृष्ठों पर HTTPS का उपयोग करने के लिए अच्छा अभ्यास माना जाता है। –

+0

मैं निश्चित रूप से आपका बिंदु देखता हूं। हालांकि, मुझे विश्वास है कि यह एक डिजाइन निर्णय होगा और जरूरी नहीं कि कुछ तकनीकी बाधा हो। ट्विटर को इस उदाहरण के रूप में लें कि इस तरह के ड्रॉपडाउन (एक गैर https पृष्ठ से) उपयोगकर्ता लॉगिन अनुभव को बढ़ाता है - दो साधारण फ़ील्ड के लिए पूर्ण पृष्ठ लोड की आवश्यकता नहीं है। –

4

अपडेट: इस कोड के उपयोग पर विचार करने से पहले इस दृष्टिकोण की सुरक्षा कमजोरियों के बारे में नीचे टिप्पणी की समीक्षा करें।

मैंने पाया कि जेपी और मैल्कम के कोड उदाहरणों का एक संकर काम करता है।

using (Html.BeginForm("Login", "Account", FormMethod.Post, new { @action = Url.Action("Login","Account",ViewContext.RouteData.Values,"https") })) 

फिर भी थोड़ा हैकी महसूस किया गया, इसलिए मैंने एक कस्टम BeginForm सहायक बनाया। कस्टम सहायक क्लीनर है और स्थानीय रूप से चलते समय https की आवश्यकता नहीं होती है।

public static MvcForm BeginFormHttps(this HtmlHelper htmlHelper, string actionName, string controllerName) 
    { 
     TagBuilder form = new TagBuilder("form"); 
     UrlHelper Url = new UrlHelper(htmlHelper.ViewContext.RequestContext); 

     //convert to https when deployed 
     string protocol = htmlHelper.ViewContext.HttpContext.Request.IsLocal == true? "http" : "https"; 

     string formAction = Url.Action(actionName,controllerName,htmlHelper.ViewContext.RouteData.Values,protocol); 
     form.MergeAttribute("action", formAction); 

     FormMethod method = FormMethod.Post; 
     form.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true); 

     htmlHelper.ViewContext.Writer.Write(form.ToString(TagRenderMode.StartTag)); 

     MvcForm mvcForm = new MvcForm(htmlHelper.ViewContext); 

     return mvcForm; 
    } 

उदाहरण उपयोग:

@using (Html.BeginFormHttps("Login", "Account")) 
+0

यह वास्तव में ऐसा करने के लिए सुरक्षित नहीं है। इस दिन और उम्र में कोई कारण नहीं है कि सभी पृष्ठ https नहीं हो सकते हैं। –

+0

क्या आप विस्तार कर सकते हैं कि यह सुरक्षित क्यों नहीं है? –

+0

क्योंकि यह एक मैन-इन-द-बीच हमले के लिए कमजोर है। अनएन्क्रिप्टेड पेज को पारगमन में समझौता किया जा सकता है और यूआरएल किसी अन्य एल्स साइट पर इंगित करने के लिए संशोधित किया जा सकता है। चूंकि उपयोगकर्ता उस यूआरएल को नहीं देख सकता जिसे आप पोस्ट कर रहे हैं, उपयोगकर्ता को यह जानने का कोई तरीका नहीं है कि यह हुआ है। यहां एक उदाहरण दिया गया है http://resources.infosecinstitute.com/mitm-using-sslstrip/ –