2009-04-14 11 views
15

क्या फॉर्म प्रमाणीकरण के LoginUrl को गतिशील रूप से बदलने का कोई तरीका है? मेरे पास FormsAuth द्वारा संरक्षित पूरी साइट है, लेकिन किसी उप फ़ोल्डर में कुछ पृष्ठों के लिए, मैं उपयोगकर्ता को अलग-अलग लॉगिन पेज पर ले जाना चाहता हूं, और FormsAuth को ReturnUrl सामग्री को संभालना है। क्या यह संभव है या क्या मुझे उप फ़ोल्डर मामलों के लिए अपना खुद का रीडायरेक्ट कोड लिखना है?कुछ मामलों में प्रपत्र प्रमाणीकरण LoginUrl को ओवरराइड/बदलने के लिए कैसे करें

<forms loginUrl="~/Splash.aspx" ... /> 

संरक्षित * .aspx पृष्ठों की सभी है

<deny users="?"> 

क्या मैं:

~/LogOn1.aspx 
    ~/Protected1.aspx 
    ~/Protected2.aspx 
    ~/Subfolder/ 
    ~/Subfolder/LogOn2.aspx 
    ~/Subfolder/NotProtected.aspx 
    ~/Subfolder/Protected3.aspx 

तो मेरी web.config की तरह दिखता है:

यहाँ एक उदाहरण लेआउट है हालांकि, उपयोगकर्ता के अज्ञात होने पर ~/Subfolder/Protected3.aspx को ~/Subfolder/LogOn2.aspx पर रीडायरेक्ट किया जाना है।

मैंने किया था ~/सबफ़ोल्डर/web.config में web.config के नीचे छीन संस्करण डालने की कोशिश:

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
     <authentication mode="Forms"> 
     <forms loginUrl="~/Subfolder/LogOn.aspx" name="SiteAuth" protection="All" timeout="30" path="/" defaultUrl="~/Subfolder/default.aspx" requireSSL="true" cookieless="UseCookies" enableCrossAppRedirects="false" /> 
     </authentication> 
     <authorization> 
     <deny users="?" /> 
     </authorization> 
    </system.web> 
</configuration> 

लेकिन सब है कि मुझे हो जाता है इस त्रुटि है:

It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.

मुझे लगता है कि Subfolder dir को एक एप्लिकेशन बनाने से इस बिंदु पर और भी समस्याएं पैदा हो सकती हैं, लेकिन शायद मैं गलत हूं। यदि यह एक आवेदन था, तो क्या वह शेष कोड को बाकी/से सबफ़ोल्डर में अलग-अलग ऐप से अलग नहीं करेगा?

+0

जब आप गतिशील रूप से कहते हैं, तो क्या आप सबफ़ोल्डर में केवल कुछ पेजों को कुछ समय पर loginurl पर रीडायरेक्ट करना चाहते हैं? या क्या आप सबफ़ोल्डर में सभी पेजों को हमेशा लॉगिनरल पर रीडायरेक्ट करना चाहते हैं? – rahkim

+0

मेरे पास सबफ़ोल्डर में कुछ पृष्ठ हैं जो अज्ञात पहुंच की अनुमति देते हैं, इसलिए उन्हें रीडायरेक्ट करने की आवश्यकता नहीं है। लेकिन उपफोल्डर में पृष्ठ जो इनकार करते हैं = "?" मैं ~/subfolder/LogOn.aspx पर रीडायरेक्ट करना चाहता हूं, जहां सबफ़ोल्डर के बाहर साइट के सुरक्षित पृष्ठ शेष ~/LogOn.aspx पर रीडायरेक्ट हो जाते हैं। – slolife

+0

क्या लिंक मदद करता है? – rahkim

उत्तर

10

आपको हो रही समस्या है कि Forms element केवल आवेदन के स्तर पर अनुमति दी है है - आप एक उप में परिभाषित नहीं किया जा सकता web.config।

दुर्भाग्य से आप इसे Location element का उपयोग करके परिभाषित नहीं कर सकते हैं, और FormsAuthentication.LoginUrl संपत्ति केवल पढ़ी जाती है।

थोड़ा सा शिकार करना, ऐसा लगता है कि आपका सबसे अच्छा शर्त आपके लॉगिन पेज पर कुछ कोड होना चाहिए जो यह पता लगाता है कि उपयोगकर्ता कहां से आया है (यानी "रिटर्न यूआरएल" क्वेरी स्ट्रिंग के मान की जांच करके) और रीडायरेक्ट करना यदि आपका उपनिर्देशिका से है तो आपका अन्य लॉगिन पेज। हालांकि मैं मानता हूं कि यदि आप एकाधिक उप-निर्देशिकाओं के लिए कस्टम लॉगिन पेज चाहते हैं तो यह ठीक से स्केल नहीं करता है। :(


अपने संपादित करने के लिए repsonse में - हाँ, बनाने के लिए एक आवेदन इस त्रुटि "हल" होगा उप फ़ोल्डर, लेकिन जैसा कि आप बाहर बिंदु, तो आप और अधिक समस्याओं होगा, जैसा कि आप आवश्यकता होगी सभी प्रासंगिक बाइनरी, एपकोड को स्थानांतरित करने के लिए, आप उस उप-फ़ोल्डर में भी क्या हैं, इसलिए यह वास्तव में कोई समाधान नहीं है।

5

प्रत्येक सबफ़ोल्डर आपको एक अलग वेब कॉन्फ़िगर फ़ाइल प्राप्त करने की अनुमति देता है। तो अगर आप टैग के साथ अपने उप-फ़ोल्डर में एक web.config डाल सकता है:

<authentication mode="Forms"> 
    <forms loginUrl="~/Subfolder/LogOn2.aspx" /> 
</authentication> 
+2

जब मैं उपफोल्डर में छीन लिया गया वेब.कॉन्फिग डालता हूं तो त्रुटि प्राप्त होती है: यह अनुमति देने वाले अनुभाग का उपयोग करने में त्रुटि है Definition = आवेदन स्तर से परे 'मशीन टू एप्लिकेशन'। यह त्रुटि आभासी निर्देशिका के कारण आईआईएस में एक अनुप्रयोग के रूप में कॉन्फ़िगर नहीं किया जा सकता है। – slolife

+0

ओह ... मुझे और स्पष्ट होना चाहिए था। आपको उपफोल्डर में नियमित वेब.कॉन्फिग रखना चाहिए, बस प्रमाणीकरण के लिए टैग शामिल करना सुनिश्चित करें। – rahkim

+0

यहां एकाधिक कॉन्फ़िगरेशन का उपयोग करने का नमूना है - http://www.codeproject.com/KB/aspnet/multipleWebConfig.aspx – rahkim

7

मुझे यह समस्या भी थी और इसे हल करने की कोशिश करने के लिए यहां बस गए हैं, तो याद किया गया था यह बहुत समय पहले और मैंने जो किया था वह पृष्ठ_लोड ईवेंट में रूट फ़ोल्डर में डिफ़ॉल्ट login.aspx पृष्ठ में था, मैंने अपनी उप निर्देशिका प्रबंधन और इसके login.aspx पृष्ठ पर वापसी url के आधार पर एक रीडायरेक्ट किया था! आपको दोहराना होगा प्रत्येक उप निर्देशिका के लिए प्रासंगिक बिट।

public void Page_Load(object sender, EventArgs e) 
{ 
//check for existence of ReturnUrl in QueryString  
    //if it contains manage redirect to manage login page 
    if (!String.IsNullOrEmpty(Request.QueryString["ReturnUrl"])) 
    { 
     if (Request.QueryString["ReturnUrl"].Contains("manage")) 
     { 
      Response.Redirect("manage/login.aspx"); 

     } 
    } 
} 
+0

महान जवाब, मेरी समस्या हल! केवल एक चीज जो मैं जोड़ूंगा वह यह है कि web.config को स्पष्ट रूप से उपयोगकर्ताओं को उप निर्देशिका लॉगिन पृष्ठों तक पहुंचने की अनुमति देने की आवश्यकता होगी ताकि आपको बेस लॉगिन पृष्ठ और उपनिर्देशिका लॉगिन पृष्ठ के बीच एक पुनरावर्ती रीडायरेक्ट न मिले। –

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