2009-02-27 13 views
7

जब कोई उपयोगकर्ता मेरी साइट में किसी लिंक पर क्लिक करता है जिसके लिए प्रमाणीकरण की आवश्यकता होती है, तो ब्राउज़र को लॉगिन पृष्ठ पर रीडायरेक्ट किया जाता है। लॉगिन पेज में returnUrl querystring पैरामीटर शामिल है। समस्या यह है कि यदि उपयोगकर्ता ओपनआईडी का उपयोग करके प्रमाणित करता है, तो प्रदाता उपयोगकर्ता को लॉगिन पृष्ठ पर रीडायरेक्ट करता है और इसमें वापसी यूआरएल पैरामीटर शामिल नहीं होता है, जो बहुत उबाऊ है क्योंकि मैं उपयोगकर्ता को पृष्ठ के बजाय होम पेज पर रीडायरेक्ट करता हूं ।मैं ओपनआईडी के लिए रिटर्न यूआरएल कैसे बदल सकता हूं?

मैं DotNetOpenID उपयोग कर रहा हूँ, तो इसे ठीक करने के लिए एक तरीका है?

उत्तर

11

यह वास्तव में आसान, ब्रूनो है। बस

IAuthenticationRequest.AddCallbackArguments("returnUrl", Request.QueryString["returnUrl"]); 

कि DotNetOpenId बता प्रवेश पृष्ठ पर returnUrl तर्क संरक्षण और व्यवहार आप चाहते हैं पाने के लिए होगा कहते हैं। मुझे यूआरएल को अलग करने के बारे में फ्रांसी से असहमत होना है जो परिणाम को संसाधित करने वाले लॉगिन पृष्ठ को प्रदर्शित करता है। ASP.NET MVC साइटों कि उपयुक्त हो सकता है, लेकिन ASP.NET वेब प्रपत्रों के लिए है कि वास्तव में जाने का रास्ता नहीं है, के बाद से उपयोगकर्ता के लिए किसी भी त्रुटि प्रदर्शित करने के अलावा आप कोई संदेह नहीं है भी लॉगिन प्रपत्र प्रदर्शित करने के लिए चाहता हूँ के लिए फिर। इसके अलावा, जहां तक ​​तर्क को अलग किया जाता है, DotNetOpenId लाइब्रेरी आपके लिए भारी भारोत्तोलन करता है, इसलिए आपके कोड-बैक पेज में वैसे भी कोई तर्क नहीं है।

+1

क्या यह AddCallbackArgument ** एस ** –

+0

होना चाहिए, धन्यवाद। मैंने अपना जवाब सही कर दिया है। –

+0

इतना आसान नहीं है: "कॉलबैक तर्क केवल तभी समर्थित होते हैं जब OpenIdRelyingParty पर एक IRelyingPartyAssociationStore प्रदान किया जाता है।" – Perry

3

यदि आप ओपनआईडी प्रदाता को एक अलग यूआरएल पर वापस लौटना चाहते हैं, तो आपको प्रमाणीकरण अनुरोध बनाते समय OpenIdRelyingParty.CreateRequest(Identifier userSuppliedIdentifier, Realm realm, Uri returnToUrl) विधि का उपयोग करने की आवश्यकता है।

हालांकि, आम तौर पर आप नहीं OpenID प्रदाता url है जो अपने एप्लिकेशन में लॉगिन अनुक्रम शुरू की के लिए वापस रीडायरेक्ट करना चाहते हैं। आप उस बिंदु पर वापस आना चाहते हैं जहां आपने ओपनआईडी ऑथ को सही तरीके से प्रतिक्रिया देने के लिए शुरू किया था। ओपनआईडी परत को अपने ऐप में शेष तर्क से encapsulating में मदद करता है।

यहाँ एक उदाहरण है:

मेरी ASP.NET MVC अनुप्रयोग में, मैं Authenticate कार्रवाई जो लॉगिन अनुरोधों को प्रबंधित के साथ एक User नियंत्रक की है।

Authenticate कार्रवाई OpenIdRelyingParty.Response जाँच करता है। यदि यह null है, तो कार्रवाई RedirectToProvider पर कॉल करती है। प्रदाता उसी क्रिया पर वापस आ जाता है, जहां मैं Respons.Status जांचता हूं। यदि यह AuthenticationStatus.Authenticated है तो मैं उस पृष्ठ पर वापस जाने के लिए FormsAuthentication.RedirectFromLoginPage(openid.Response.ClaimedIdentifier, true) का उपयोग करता हूं, जिस पर उपयोगकर्ता ने लॉगिन सेक्वेन्स शुरू किया था।

हालांकि, यदि स्थिति AuthenticationStatus.Failed या 'प्रमाणीकरणस्टैटस। रद्द' है, तो मैं इस समस्या को हल करने के लिए उपयोगकर्ता चरणों की पेशकश कर सकता हूं। यदि उन्हें गलत टाइप किया गया है या इसके बजाय उपयोगकर्ता नाम/पासवर्ड के साथ लॉगिन करने के लिए मैं उन्हें अपने OpenID को सही करने के लिए ऑफ़र कर सकता हूं। (मैं एक ही identitites के लिए दोनों OpenID और उपयोगकर्ता नाम/पासवर्ड प्रमाणीकरण का समर्थन)

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

+0

मैंने इसे आपके जैसा बनाया है, लेकिन समस्या यह है कि जब प्रदाता उपयोगकर्ता को मेरी प्रमाणीकृत कार्रवाई पर रीडायरेक्ट करता है, तो returnUrl पैरामीटर चला गया है ... इसलिए RedirectFromLoginPage काम नहीं करता है ... – Bruno

+0

प्रमाणीकरण विधि को कॉल करें क्वेरी में वापसी यूआरएल - http: // localhost/user/प्रमाणीकृत? returnurl =/somepage और uid = http: //myopenid.com/francip। जब ओपनआईडी प्रदाता प्रमाणीकरण विधि पर वापस आ जाता है, तो returnUrl फिर से क्वेरी में होना चाहिए। –

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

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