2012-11-08 20 views
11

में वाईआईएफ प्रमाणीकरण से विशिष्ट पथ को बहिष्कृत करें हमने की सहायता से हमारे एएसपी.NET 4.5 एमवीसी 4 प्रोजेक्ट में विंडोज पहचान नींव (डब्ल्यूआईएफ) सफलतापूर्वक कॉन्फ़िगर किया है ... एक्सटेंशन विजुअल स्टूडियो 2012 के लिए। लेकिन अज्ञात पहुंच की अनुमति देने के लिए प्राधिकरण से विशिष्ट पथ को बाहर करने में असमर्थ हैं।एएसपी.नेट एमवीसी 4 प्रोजेक्ट

जब हम अपने डिफ़ॉल्ट मार्ग (यानी /Home) तक पहुंचते हैं, तो निष्क्रिय पुनर्निर्देशन हमें कॉन्फ़िगर किए गए जारीकर्ता उरी को रीडायरेक्ट करेगा। यह सही है। लेकिन अब मान लें कि हम एसटीएस प्रमाणीकरण से पथ /Guest को बाहर करना चाहते हैं ताकि सभी एसटीएस जारीकर्ता को भेजे गए मधुमक्खी के बिना http://ourhost/Guest तक पहुंच सकें। केवल स्थिर दस्तावेज वहां स्थित हैं। Web.config से

स्निपेट्स:

<system.identityModel> 
    <identityConfiguration> 
    <audienceUris> 
     <add value="http://ourhost/" /> 
    </audienceUris> 
    <issuerNameRegistry type="System.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <trustedIssuers> 
     <add thumbprint="9B74****40D0" name="OurSTS" /> 
     </trustedIssuers> 
    </issuerNameRegistry> 
    <certificateValidation certificateValidationMode="None" /> 
    </identityConfiguration> 
</system.identityModel> 
<system.identityModel.services> 
    <federationConfiguration> 
    <cookieHandler requireSsl="false" /> 
    <wsFederation passiveRedirectEnabled="true" issuer="http://oursts/Issue" realm="http://ourhost/" reply="http://ourhost/" requireHttps="false" /> 
    </federationConfiguration> 
</system.identityModel.services> 

इसके अलावा हमारे पास ...

<system.webServer> 
    <!-- ... --> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" /> 
    <add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" /> 
    <remove name="FormsAuthentication" /> 
    </modules> 
</system.webServer> 

और अंत में:

:

<system.web> 
    <!-- ... --> 
    <authentication mode="None" /> 
</system.web> 

हम सफलता के बिना निम्नलिखित की कोशिश की

हमने सफलता के बिना, इस फ़ोल्डर में एक छोटी Web.config फ़ाइल डालने का भी प्रयास किया। इससे कोई फर्क नहीं पड़ता कि हम ब्राउज़र में किस उरी को ढूंढते हैं, हम हमेशा रीडायरेक्ट होते हैं।

इसे पूरा करने का सही तरीका क्या है?

संपादित

हटाया पिछले Eugenios answer करने के लिए "जवाब स्वीकार", सेट "स्वीकार किए जाते हैं जवाब है" के रूप में इस और अधिक उपयोगी जबाब है।

उत्तर

11

एक एमवीसी ऐप में आप आमतौर पर नियंत्रकों और कार्यों में [Authorize] विशेषता के माध्यम से पहुंच को परिभाषित करते हैं।

बस web.config से हटा दें:

<system.web> 
    <authorization> 
     <deny users="?" /> 
     </authorization> 

नोट: यह आम तौर पर द्वारा स्वचालित रूप से जोड़ दिया जाता है VS2010

में जादूगर "एसटीएस संदर्भ जोड़ें"

ऐसा लगता है कि व्यवहार बिल्कुल वैसा ही है वीएस2012 और नए उपकरण पर। मैंने अभी एक नया नया एमवीसी 4 ऐप बनाया है। एक स्थानीय कॉन्फ़िगरेशन एसटीएस (सभी डिफ़ॉल्ट छोड़ दिया) के साथ "पहचान और पहुंच ..." उपकरण चलाएं।

यह web.config को यह टुकड़ा जोड़ने के लिए क्या किया:

<authorization> 
    <deny users="?" /> 
</authorization> 

मैं इसे हटा दिया और के बारे में नियंत्रक कार्रवाई करने के लिए [Authorize] कहा:

[Authorize] 
public ActionResult About() 
{ 
    ViewBag.Message = "Your app description page."; 

    return View(); 
} 

जब मैं "के बारे में" लिंक पर क्लिक , तो मुझे एसटीएस पर रीडायरेक्ट किया जाता है। बाकी सब कुछ अज्ञात पहुंच के साथ काम करता है।

नोट:

तुम भी विज़ार्ड में इस पर कुछ नियंत्रण (विज़ार्ड के "विन्यास" पृष्ठ देखें) है।

+0

धन्यवाद यूगेनियो, हम Visual Studio 2012 का उपयोग कर रहे हैं और "एसटीएस संदर्भ जोड़ें" नहीं है अब और उपलब्ध है, आपको "पहचान और एसी" का उपयोग करना होगा सेस ... "इसके बजाय उपकरण। मुझे लगता है कि मैं समाधान के करीब हूं, ऐसा लगता है कि 'passiveRedirectEnabled = "true" 'किसी भी विशेषता के उपयोग के बावजूद मुझे एसटीएस पर रीडायरेक्ट कर रहा था।कस्टम प्रमाणीकरण विशेषता के अंदर कुछ पुनर्निर्देशन सहायताकर्ताओं का उपयोग करके 'झूठी' पर सेट करना और रीडायरेक्ट करना अभी बहुत अच्छा लगता है। जब मैं कर रहा हूं तो मेरा समाधान पोस्ट करूँगा, धन्यवाद! – thmshd

+0

मैं देखता हूं। इसे passiveRedirectEnabled = true के साथ भी काम करना चाहिए। मैं अपने सिस्टम पर भी जांच करूंगा। –

+0

क्योंकि मुझे वास्तव में passiveRedirectEnabled विकल्प सक्षम करने में समस्याएं थीं, मैं समाधान के रूप में अपना उत्तर स्वीकार करना चाहता हूं, लेकिन मैं वास्तव में इस विषय पर आपकी सहायता की सराहना करता हूं और मेरा मानना ​​है कि यह शायद भी काम कर रहा है, लेकिन हो सकता है कि समाधान कहीं भी दफन हो आईआईएस सेटअप के साथ संयोजन में मेरी 'web.config' सेटिंग्स। आपके समय के लिए धन्यवाद, वास्तव में सराहना की! – thmshd

2

अंततः मुझे सही दिशा में इंगित किया गया था एक पुराना blog post जो बताता है कि किसी विशिष्ट नियंत्रक या पृष्ठ के क्षेत्र की रक्षा कैसे करें। वैश्विक फिल्टर के संयोजन में मैं लगभग वहां हूं।

ऐसा लगता है कि passiveRedirectEnabled="true" विकल्प का उपयोग नहीं करना है, लेकिन इसे false पर सेट करें। केवल तभी आपके पास प्रमाणीकरण प्रक्रिया पर पूर्ण नियंत्रण होता है, लेकिन SignInRequestMessage कक्षा (जो एक बड़ा सौदा नहीं है) का उपयोग करके, फिर आप निष्क्रिय पुनर्निर्देशन को ट्रिगर करने की आवश्यकता होगी।

कम कोड के साथ बेहतर समाधान स्वागत है।

संपादित

निकाली गई "स्वीकार जवाब" इस के लिए राज्य, सेट Eugenios anwer करने के लिए "स्वीकार किए जाते हैं जवाब है" के रूप में इस और अधिक उपयोगी जबाब है।

2

मैं थॉमस के समान स्थिति में था। मेरे मामले में, मैं स्थानीय रूप से IISExpress का परीक्षण/उपयोग कर रहा था।

यूजीनियो के जवाब ने मुझे एक अतिरिक्त आवश्यकता के साथ लगभग काम किया। मुझे अपनी एमवीसी प्रोजेक्ट प्रॉपर्टी में "सक्षम" में "बेनामी प्रमाणीकरण" सेट करना पड़ा।

यह या तो डिफ़ॉल्ट रूप से अक्षम किया गया था या संभावित रूप से वीएस 2012 "पहचान और एक्सेस ..." टूलिंग का उपयोग करते समय सेट किया गया था।

तो, संक्षेप में, लिखने/बनाए रखने के लिए कोई कोड या विशेष विशेषताएं नहीं थीं।

मेरे csproj फ़ाइल में शामिल हैं:

<IISExpressAnonymousAuthentication>enabled</IISExpressAnonymousAuthentication> 

मेरे web.config शामिल हैं:

<system.web> 
    <authentication mode="None" /> 
</system.web> 

<system.web> 
    <authorization> 
     <allow users="*" /> 
    </authorization> 
</system.web> 

<system.webServer> 
    <modules> 
     <remove name="FormsAuthentication" /> 
     <add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" /> 
     <add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" /> 
    </modules> 
</system.webServer> 

<system.identityModel.services> 
    <federationConfiguration> 
     <wsFederation passiveRedirectEnabled="true" issuer="https://REMOVED.accesscontrol.windows.net/v2/wsfederation" realm="urn:REMOVED" requireHttps="false" /> 
    </federationConfiguration> 
</system.identityModel.services> 

और, मैं मानक [अधिकृत] जोड़ कार्यों कि मैं WIF द्वारा बचाव किया जाना चाहते हैं नियंत्रक से जोड़कर देखते हैं :

[Authorize] 
public ActionResult About() 
{ 
.... 
} 
4

मैं काम करने के लिए [Authorize] नहीं मिल सकता है - यह रीडायरेक्ट नहीं कर रहा है मेरे एसटीएस के लिए, और मुझे यकीन है कि यह कुछ है जो मुझे याद आ रही है। मैंने पाया कि मूल पूछने के लिए कैसे हल किया जाए, हालांकि।

में global.asax:

protected void Application_Start() 
    { 
     ... config stuff ... 
     FederatedAuthentication.WSFederationAuthenticationModule.AuthorizationFailed += WSFederationAuthenticationModule_AuthorizationFailed; 
    } 

और उसके बाद:

void WSFederationAuthenticationModule_AuthorizationFailed(object sender, AuthorizationFailedEventArgs e) 
    { 
     // Do path/file detection here 
     if (Request.Path.Contains("/Content/") || Request.Path.Contains("/Scripts/")) 
     { 
      e.RedirectToIdentityProvider = false; 
     } 
    } 
+1

धन्यवाद, एंड्रयू, मैं यह इंगित करना चाहता हूं कि यह दृष्टिकोण सुरक्षा छेद बनाता है, क्योंकि अब मैं जो भी नियंत्रक और क्रिया चाहता हूं उसे एक्सेस कर सकता हूं, क्योंकि मैं यूआरएल के अंत में ऐसा कुछ जोड़ सकता हूं: "#/सामग्री/"और वह प्रारंभिक रूटिंग को नहीं बदलेगा, लेकिन यह मुझे नियंत्रक तक पहुंच देगा। –

+0

यह मेरे लिए काम नहीं करता है, जबकि स्वीकृत उत्तर बिना किसी अतिरिक्त परिवर्तन के काम करता है। मुझे अभी भी 401 प्रतिक्रिया मिल रही थी। – itslittlejohn

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