MVC

2009-07-27 16 views
5

में ASP.Net सदस्यता के साथ OpenId एकीकृत करने के लिए मैं कैसे MVC में OpenId परीक्षण करने के लिए MVC स्टोरफ्रंट से निम्नलिखित कोड का उपयोग कर रहा हूँ। कैसे मैं इसे अपने ASP.Net सदस्यता के साथ एकीकृत तो मैं भूमिकाओं का उपयोग कर सकते हैं और मेरे तालिकाओं में उपयोगकर्ता के लिए एक उपयोगकर्ता नाम सहेज सकता हूँ? मेरा मानना ​​है कि एसओ भी इसी तरह का उपयोग कर रहा है।MVC

public ActionResult OpenIdLogin() 
    { 
     string returnUrl = VirtualPathUtility.ToAbsolute("~/"); 
     var openid = new OpenIdRelyingParty(); 
     var response = openid.GetResponse(); 
     if (response == null) 
     { 
      // Stage 2: user submitting Identifier 
      Identifier id; 
      if (Identifier.TryParse(Request["openid_identifier"], out id)) 
      { 
       try 
       { 
        IAuthenticationRequest req = openid.CreateRequest(Request["openid_identifier"]); 

        var fetch = new FetchRequest(); 
        //ask for more info - the email address 
        var item = new AttributeRequest(WellKnownAttributes.Contact.Email); 
        item.IsRequired = true; 
        fetch.Attributes.Add(item); 
        req.AddExtension(fetch); 

        return req.RedirectingResponse.AsActionResult(); 
       } 
       catch (ProtocolException ex) 
       { 
        ViewData["Message"] = ex.Message; 
        return View("Logon"); 
       } 
      } 
      else 
      { 
       ViewData["Message"] = "Invalid identifier"; 
       return View("Logon"); 
      } 
     } 
     else 
     { 
      // Stage 3: OpenID Provider sending assertion response 
      switch (response.Status) 
      { 
       case AuthenticationStatus.Authenticated: 

        var fetch = response.GetExtension<FetchResponse>(); 
        string name = response.FriendlyIdentifierForDisplay; 
        if (fetch != null) 
        { 
         IList<string> emailAddresses = fetch.Attributes[WellKnownAttributes.Contact.Email].Values; 
         string email = emailAddresses.Count > 0 ? emailAddresses[0] : null; 
         //don't show the email - it's creepy. Just use the name of the email 
         name = email.Substring(0, email.IndexOf('@')); 
        } 
        else 
        { 

         name = name.Substring(0, name.IndexOf('.')); 
        } 

        //FormsAuthentication.SetAuthCookie(name, false); 
        SetCookies(name, name); 
        AuthAndRedirect(name, name); 

        if (!string.IsNullOrEmpty(returnUrl)) 
        { 
         return Redirect(returnUrl); 
        } 
        else 
        { 
         return RedirectToAction("Index", "Home"); 
        } 
       case AuthenticationStatus.Canceled: 
        ViewData["Message"] = "Canceled at provider"; 
        return View("Logon"); 
       case AuthenticationStatus.Failed: 
        ViewData["Message"] = response.Exception.Message; 
        return View("Logon"); 
      } 
     } 
     return new EmptyResult(); 

    } 

    ActionResult AuthAndRedirect(string userName, string friendlyName) 
    { 
     string returnUrl = Request["ReturnUrl"]; 
     SetCookies(userName, friendlyName); 

     if (!String.IsNullOrEmpty(returnUrl)) 
     { 
      return Redirect(returnUrl); 
     } 
     else 
     { 
      return RedirectToAction("Index", "Home"); 
     } 
    } 

उत्तर

6

आपके जैसे StackOverflow पर पहले से ही कई सवाल हैं। This one विशेष रूप से समान लगता है।

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

लेकिन यदि आप एक नई साइट लिख रहे हैं और बस "मेरी भूमिकाओं में उपयोगकर्ता के लिए भूमिका का उपयोग करें और उपयोगकर्ता नाम को सहेजें" जैसा कि आपने कहा था, तो एएसपी.NET सदस्यता का उपयोग न करें। यह इतना लायक नहीं है! यह ओपनआईडी के पासवर्ड-कम प्रतिमान को फिट नहीं करता है और किसी और चीज की तुलना में अधिक दुःख का कारण बनता है। यदि आप डेटाबेस की थोड़ी सी जानकारी से डरते नहीं हैं, तो इसे इस तरह से करें। और आप अपने FormsAuthentication.RedirectFromLoginPage या FormsAuthentication.SetAuthCookie को जारी करके भूमिकाओं को पार करके आसानी से भूमिकाएं प्राप्त कर सकते हैं।

+0

मैं एक नए कार्यान्वयन के साथ खेल रहा हूं इसलिए, मैं एएसपी.NET सदस्यता से विशेष रूप से विवाहित नहीं हूं। क्या आप नमूना कोड के साथ सुझाव दे सकते हैं कि आपने इसका उल्लेख कैसे किया है? – Picflight

+0

मैं नमूना कोड के लिए यहां "मुझे भी" छोड़ दूंगा। किसी के बारे में पता है? –

+0

सभी नमूनों और परियोजना टेम्पलेट्स कि DotNetOpenAuth साथ जहाज जिस तरह से मैंने कहा है। –

1

ओपन आईडी प्रदाता उपयोगकर्ता के बारे में डेटा वापस कर देगा। यदि आप जानकारी के विशिष्ट टोकन का अनुरोध/आवश्यकता नहीं करते हैं, तो आपको दिया जाएगा कि उपयोगकर्ता का डिस्प्ले नाम और पहचान यूआरएल है।

आप जिस खुली आईडी लाइब्रेरी का उपयोग कर रहे हैं उसके आधार पर, आप फर्स्टनाम अंतिम नाम, डीओबी (यदि आप वास्तव में परवाह करते हैं) जैसे टोकन का अनुरोध कर सकते हैं और यदि उपयोगकर्ता ने अपनी चुनी पहचान पर यह जानकारी प्रदान की है, तो आप इसे वापस कर पाएंगे आप।

फिर आप इस का उपयोग सदस्यता प्रणाली में एक नया उपयोगकर्ता बनाने के लिए कर सकते हैं। सदस्यता API की आवश्यकताओं को पूरा करने के लिए आपको शायद उन्हें एक डमी पासवर्ड देना होगा।

एक लॉगिन प्रमाणित करने के लिए, 1 फार्म का है कि उपयोगकर्ता नाम & पासवर्ड और अन्य है कि एक पहचान यूआरएल लेता है लेता है प्रदान करते हैं। उपयोगकर्ता को ओपन आईडी के माध्यम से सत्यापित करने के बाद, सदस्यता API में उपयोगकर्ता नाम (पहचान यूआरएल) द्वारा उपयोगकर्ता को खोजने का प्रयास करें। यदि यह अस्तित्व में नहीं है, तो इसे बनाएं।