2015-07-07 21 views
6

Tôi khá mới để Identity và cố gắng tìm hiểu bằng cách xem video trong https://channel9.msdn.com/Series/Customizing-ASPNET-Authentication-with-IdentityLinking đăng nhập bên ngoài để người dùng hiện

Trong mặc định mẫu ASP.Net MVC, bạn có thể liên kết nhiều thông tin đăng nhập bên ngoài (google, facebook) để tài khoản của bạn (thông qua /Manage) nếu bạn đã đăng nhập.

Nhưng điều gì sẽ xảy ra nếu người dùng đăng nhập lần đầu vào trang web của chúng tôi bằng tài khoản google của họ và đăng xuất khỏi tài khoản này và một ngày khác cố đăng nhập bằng tài khoản facebook của họ. Giả sử cả tài khoản facebook và google của họ sử dụng cùng một địa chỉ email, người dùng sẽ không thể đăng nhập vào trang web vì mẫu mặc định không cho phép điều đó là UserManager.CreateAsync sẽ bị lỗi. Tôi biết họ có thể thay đổi email và đăng nhập của họ, nhưng điều đó sẽ tạo hai tài khoản khác nhau cho cùng một người dùng.

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

tôi thay đổi mã trong ExternalLoginConfirmation để nó kiểm tra nếu người dùng tồn tại và quảng cáo cung cấp bên ngoài mới để AspNetUserLogins. Bất cứ ai có thể vui lòng cho tôi biết nếu điều này là đúng cách để làm điều này? hoặc nếu có cách làm tốt hơn.

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

Bạn có xác nhận đây là cách lý tưởng để xử lý việc này không? – stephen776

+1

Không, nhưng đây là cách tôi đang sử dụng nó vào lúc này cho một dự án tôi đang làm việc. Tôi cũng đã thử hỏi điều này trong diễn đàn Microsoft Virtual Academy. Nhưng tiếc là không có câu trả lời nào được nêu ra. – Amila

+0

Tôi hiện đang ở trong tình trạng tương tự như bạn đã làm. Tôi đã suy nghĩ về việc làm nó theo cùng một cách. Bạn có thể vui lòng cho chúng tôi biết nếu bạn tìm thấy giải pháp tốt hơn không? – TTCG

Trả lời

0

Tôi cũng khá mới để nhận dạng và gặp phải vấn đề tương tự, mặc dù giải pháp của tôi khá khác nhau. Tôi không sử dụng Entity Framework và để đạt được điều này, tôi đã phải viết lại toàn bộ engine Identity với các lớp tùy chỉnh. Tôi có các bảng Sql Server riêng của mình khác với các bảng do EF tạo ra. EF lưu trữ danh tính trong 5 bảng: người dùng, vai trò, userroles, userclaims và userlogins. Tôi chỉ sử dụng ba cái đầu tiên. Trong môi trường của tôi AddLoginAsync là không cần thiết vì bảng không tồn tại. Tôi lưu trữ tất cả các đăng nhập cục bộ/bên ngoài và người dùng đã đăng ký trong bảng người dùng. Yêu cầu được lưu trữ dưới dạng userroles khi được yêu cầu.

Cách tôi nhận được trùng lặp Tên người dùng và email (đăng nhập bằng cách sử dụng các nhà cung cấp khác nhau có cùng địa chỉ email đã đăng ký) là xóa kiểm tra xác thực tên người dùng và email hiện có trước khi tạo người dùng bằng UserValidator tùy chỉnh. Bảng cho phép trùng lặp. Khi đăng nhập, tôi thực hiện kiểm tra tùy chỉnh tính duy nhất dựa trên tên người dùng/nhà cung cấp (bên ngoài) hoặc email/passwordhash (cục bộ). Nó dường như được làm việc.

Các vấn đề liên quan