2009-07-27 21 views
5

MVC'de OpenId'yi test etmek için MVC Storefront'dan aşağıdaki kodu kullanıyorum. Bunu ASP.Net Üyelik ile nasıl bütünleştirebilirim, böylece rolleri kullanabilir ve tablolarımdaki kullanıcı için bir kullanıcı adı kaydedebilir miyim? SO'nın da benzer bir şey kullandığına inanıyorum.MVI ile ASP.Net Üyeliği'ne nasıl bağlanır?

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"); 
     } 
    } 

cevap

6

Şu anda StackOverflow üzerinde çok sayıda soru var. This one özellikle benzer görünüyor.

Zaten siteniz için Üyelik sağlayıcısını kullanıyor ve buna yalnızca OpenID ekliyorsanız, o zaman Üyelik ile takılı kaldığınızı tahmin ediyorum ve almak için bağlandığım soruların yanıtlarından birini kullanabilirsiniz. MAYIS sizin için çalışabilecek yarı saygın bir üyelik sağlayıcısı.

Ancak, yeni bir site yazıyorsanız ve sadece "siz rolleri kullanıp tablolarıma kullanıcı için bir kullanıcı adı kaydetmek" isterseniz, ASP.NET Üyeliğini KULLANMAYIN. Bu buna değmez! OpenID'nin parolasız paradigmasına uymuyor ve sadece başka bir şeyden daha fazla keder yaratıyor. Eğer biraz veritabanı erişiminden korkmuyorsanız, bu şekilde yapın. Ve Roles davranışını, sadece kendi FormsAuthentication.RedirectFromLoginPage veya FormsAuthentication.SetAuthCookie çağrılarınızı düzenleyerek ve kullanıcının doldurduğu rolleri ileterek kolayca alabilirsiniz.

+0

Yeni bir uygulama ile uğraştığım için özellikle ASP.NET Üyeliği ile evli değilim. Örnek kod ile bahsettiğiniz şekilde nasıl yapılmasını önerebilir misiniz? – Picflight

+0

Örnek kod için burada "ben de" bırakacağım. Hiç biliyor musun? –

+0

DotNetOpenAuth ile birlikte gönderilen tüm örnekler ve proje şablonları, bahsettiğim şekilde yapar. –

1

Açık kimlik sağlayıcısı, kullanıcı hakkındaki verileri döndürür. Belirli bilgi notlarını istemiyorsanız/gerektirmediyse, size vereceğiniz tek şey kullanıcının görünen adı ve kimlik URL'sidir.

Kullandığınız açık kimlik kitaplığına bağlı olarak, FirstName LastName, DOB (gerçekten önemsendiyseniz) gibi bir simge isteyebilir ve kullanıcı bu bilgileri kimlikleri hakkında seçtiyse, o zaman sen.

Bunu, üyelik sisteminde yeni bir kullanıcı oluşturmak için kullanabilirsiniz. Üyelik API'sinin gereksinimlerini karşılamak için muhtemelen onlara sahte bir şifre vermeniz gerekecektir.

Bir girişi doğrulamak için, kullanıcı adı & parolasını ve kimlik URL'sini alan diğerini alan 1 formu sağlayın. Açık kimliği kullanarak kullanıcıyı doğruladıktan sonra, kullanıcıyı Üyelik API'sındaki kullanıcı adına (kimlik URL'si) bulmaya çalışın. Varsa, oluşturun.

İlgili konular