2015-07-07 24 views
6

dış oturumların Bağlama ben Identity için oldukça yeni ve varsayılan ASP.Net MVC şablonunda https://channel9.msdn.com/Series/Customizing-ASPNET-Authentication-with-Identitymevcut kullanıcıya

izlerken videolarla öğrenmeye çalışıyorum, birden dış oturumların (google, facebook) bağlanabilirsiniz Eğer hesabınız varsa (/Manage aracılığıyla)

Ama kullanıcı google hesabını kullanarak web sitemize ilk giriş yaptı ve ondan çıkış yaptıktan sonra ve başka bir günde onların facebook hesabını kullanarak giriş yapmaya çalıştı. Hem facebook hem de google hesaplarının aynı e-posta adresini kullandığını varsayarsak, kullanıcı varsayılan sitenin UserManager.CreateAsync'un başarısız olmasına izin vermediğinden web sitesine giriş yapamaz. E-postalarını ve giriş bilgilerini değiştirebildiklerini biliyorum, ancak aynı kullanıcı için iki farklı hesap oluşturacak. kullanıcı AspNetUserLogins yeni harici sağlayıcıya mevcut ve reklamları eğer denetler böylece

var info = await AuthenticationManager.GetExternalLoginInfoAsync(); 
if (info == null) 
{ 
    return View("ExternalLoginFailure"); 
} 
var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; 
var result = await UserManager.CreateAsync(user); 
if (result.Succeeded) 
{ 
    result = await UserManager.AddLoginAsync(user.Id, info.Login); 
    if (result.Succeeded) 
    { 
     await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); 
     return RedirectToLocal(returnUrl); 
    } 
} 

ben ExternalLoginConfirmation kod değişmiş. Bunu yapmanın doğru yolu olup olmadığını lütfen bana söyleyebilir mi? ya da daha iyi bir yolu varsa.

if (ModelState.IsValid) 
     { 
      // Get the information about the user from the external login provider 
      var info = await AuthenticationManager.GetExternalLoginInfoAsync(); 
      if (info == null) 
      { 
       return View("ExternalLoginFailure"); 
      } 
      var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; 
      var result = await UserManager.CreateAsync(user); 
      if (result.Succeeded) 
      { 
       result = await UserManager.AddLoginAsync(user.Id, info.Login); 
       if (result.Succeeded) 
       { 
        await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); 
        return RedirectToLocal(returnUrl); 
       } 
      } 
      //new code begins 
      else if (UserManager.FindByEmail(model.Email) != null) 
      { 
       var usr = await UserManager.FindByEmailAsync(model.Email); 
       result = await UserManager.AddLoginAsync(usr.Id, info.Login); 

       if (result.Succeeded) 
       { 
        await SignInManager.SignInAsync(usr, isPersistent: false, rememberBrowser: false); 
        return RedirectToLocal(returnUrl); 
       } 
      } 
      //new code ends 
      AddErrors(result); 
     } 
+0

Bunun işlemenin en iyi yolu olduğunu onayladınız mı? – stephen776

+1

Hayır, ama şu an üzerinde çalıştığım bir proje için bunu kullanıyorum. Bunu Microsoft Virtual Academy forumunda da sormaya çalıştım. Ama maalesef henüz cevap yok. – Amila

+0

Şu anda yaptığınız gibi aynı durumdayım. Aynı şekilde yapmayı düşünüyorum. Daha iyi bir çözüm bulursanız lütfen bize bildirir misiniz? – TTCG

cevap

0

Ayrıca, Kimlik için oldukça yeni ve aynı sorunla karşılaştım, ancak çözümüm oldukça farklı. Entity Framework'ü kullanmıyorum ve bunu başarmak için tüm Identity motorunu özel sınıflarla yeniden yazmam gerekti. EF tarafından oluşturulanlara göre farklı Sql Server tablolarım var. EF, kimlikleri 5 tabloda depolar: kullanıcılar, roller, userroles, userclaims ve userlogins. Sadece ilk üçünü kullanırım. Benim ortamımda AddLoginAsync gerekli değildir çünkü tablo mevcut değil. Tüm yerel/harici girişleri ve kayıtlı kullanıcıları kullanıcı tablosunda saklıyorum. Talepler, gerektiğinde userrol olarak saklanır.

Yinelenen Kullanıcı Adları ve E-postaları (aynı kayıtlı e-posta adreslerine sahip farklı sağlayıcılar kullanarak giriş yapma) yolumu kapattığım şekilde, bir kullanıcı oluşturmadan önce özel bir KullanıcıValidator kullanarak mevcut kullanıcı adları ve e-postalar için doğrulama kontrolünün kaldırılması gerekiyordu. Tablo, kopyalara izin verir. Giriş yaparken kullanıcı adı/sağlayıcı (harici) veya e-posta/şifre (yerel) bazında benzersiz bir özel kontrol yapıyorum. Çalışıyor gibi görünüyor.

İlgili konular