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);
}
Bạn có xác nhận đây là cách lý tưởng để xử lý việc này không? – stephen776
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
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