diff --git a/src/AbpDesk/AbpDesk.Web.Mvc/AbpDesk.Web.Mvc.csproj b/src/AbpDesk/AbpDesk.Web.Mvc/AbpDesk.Web.Mvc.csproj index 14d14cd088..e90644cba6 100644 --- a/src/AbpDesk/AbpDesk.Web.Mvc/AbpDesk.Web.Mvc.csproj +++ b/src/AbpDesk/AbpDesk.Web.Mvc/AbpDesk.Web.Mvc.csproj @@ -51,10 +51,8 @@ - - - - + + diff --git a/src/Volo.Abp.Account.Web/Pages/Account/ExternalLogin.cshtml b/src/Volo.Abp.Account.Web/Pages/Account/ExternalLogin.cshtml deleted file mode 100644 index 5817404f38..0000000000 --- a/src/Volo.Abp.Account.Web/Pages/Account/ExternalLogin.cshtml +++ /dev/null @@ -1,29 +0,0 @@ -@page -@model Volo.Abp.Account.Web.Pages.Account.ExternalLoginModel -@{ - ViewData["Title"] = "Register"; -} - -

@ViewData["Title"]

-

Associate your @Model.LoginProvider account.

-
- -

- You've successfully authenticated with @Model.LoginProvider. - Please enter an email address for this site below and click the Register button to finish - logging in. -

- -
-
-
-
-
- - - -
- -
-
-
diff --git a/src/Volo.Abp.Account.Web/Pages/Account/ExternalLogin.cshtml.cs b/src/Volo.Abp.Account.Web/Pages/Account/ExternalLogin.cshtml.cs deleted file mode 100644 index 6ea57b97a7..0000000000 --- a/src/Volo.Abp.Account.Web/Pages/Account/ExternalLogin.cshtml.cs +++ /dev/null @@ -1,138 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; -using System.Security.Claims; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Identity; -using Microsoft.AspNetCore.Mvc; -using Volo.Abp.Identity; -using Volo.Abp.Ui; -using Volo.Abp.Uow; - -namespace Volo.Abp.Account.Web.Pages.Account -{ - public class ExternalLoginModel : AccountModelBase - { - private readonly SignInManager _signInManager; - private readonly UserManager _userManager; - - public ExternalLoginModel( - SignInManager signInManager, - UserManager userManager) - { - _signInManager = signInManager; - _userManager = userManager; - } - - [BindProperty] - public InputModel Input { get; set; } - - public string LoginProvider { get; set; } - - public string ReturnUrl { get; set; } - - [TempData] - public string ErrorMessage { get; set; } - - public class InputModel - { - [Required] - [EmailAddress] - public string Email { get; set; } - } - - public IActionResult OnGetAsync() - { - return RedirectToPage("./Login"); - } - - [UnitOfWork] - public virtual IActionResult OnPost(string provider, string returnUrl = null) - { - // Request a redirect to the external login provider. - var redirectUrl = Url.Page("./ExternalLogin", pageHandler: "Callback", values: new { returnUrl }); - var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl); - return new ChallengeResult(provider, properties); - } - - [UnitOfWork] - public virtual async Task OnGetCallbackAsync(string returnUrl = null, string remoteError = null, string returnUrlHash = "") - { - if (remoteError != null) - { - ErrorMessage = $"Error from external provider: {remoteError}"; - return RedirectToPage("./Login"); - } - - var info = await _signInManager.GetExternalLoginInfoAsync(); - if (info == null) - { - return RedirectToPage("./Login"); - } - - // Sign in the user with this external login provider if the user already has a login. - var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true); - if (result.Succeeded) - { - return RedirectSafely(returnUrl, returnUrlHash); - } - - if (result.IsLockedOut) - { - throw new UserFriendlyException("Cannot proceed because user is locked out!"); - } - - ReturnUrl = returnUrl; - LoginProvider = info.LoginProvider; - - //User does not have an account, create an account. - var success = await CreateUserAsync(returnUrl, returnUrlHash); - - if (success) - { - return RedirectSafely(returnUrl, returnUrlHash); - } - - return Page(); - } - - [UnitOfWork] - public virtual async Task CreateUserAsync(string returnUrl = null, string returnUrlHash = null) - { - if (!ModelState.IsValid) - { - return false; - } - - // Get the information about the user from the external login provider - var info = await _signInManager.GetExternalLoginInfoAsync(); - if (info == null) - { - throw new ApplicationException("Error loading external login information during confirmation."); - } - - var user = new IdentityUser(GuidGenerator.Create(), info.Principal.FindFirstValue(ClaimTypes.Email)); - - var result = await _userManager.CreateAsync(user); - - //todo: needs to check identity errors? - //CheckIdentityErrors( await _userManager.CreateAsync(user)); - - if (result.Succeeded) - { - result = await _userManager.AddLoginAsync(user, info); - if (result.Succeeded) - { - await _signInManager.SignInAsync(user, false); - return true; - } - } - - foreach (var error in result.Errors) - { - ModelState.AddModelError(string.Empty, error.Description); - } - - return false; - } - } -} \ No newline at end of file diff --git a/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml b/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml index 62b8c70dfd..de098fa3f9 100644 --- a/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml +++ b/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml @@ -26,36 +26,20 @@ - -
-
+ + @if (Model.ExternalLogins.Any()) + { +

Use another service to log in.

-
- @{ - if ((Model.ExternalLogins?.Count ?? 0) == 0) - { -
-

- There are no external authentication services configured. See this article - for details on setting up this ASP.NET application to support logging in via external services. -

-
- } - else - { -
-
-

- @foreach (var provider in Model.ExternalLogins) - { - - } -

-
-
- } - } -
-
+
+
+ @foreach (var provider in Model.ExternalLogins) + { + + } +
+
+ + } \ No newline at end of file diff --git a/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs b/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs index 39a3e40bb7..8a27bc28a5 100644 --- a/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs +++ b/src/Volo.Abp.Account.Web/Pages/Account/Login.cshtml.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; +using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Identity; @@ -21,10 +22,12 @@ namespace Volo.Abp.Account.Web.Pages.Account public IList ExternalLogins { get; set; } private readonly SignInManager _signInManager; + private readonly IdentityUserManager _userManager; //TODO: We should not use domain from presentation..? - public LoginModel(SignInManager signInManager) + public LoginModel(SignInManager signInManager, IdentityUserManager userManager) { _signInManager = signInManager; + _userManager = userManager; } public async Task OnGetAsync(string returnUrl = "", string returnUrlHash = "") @@ -61,6 +64,71 @@ namespace Volo.Abp.Account.Web.Pages.Account //TODO: Use LocalRedirect and Url.GetLocalUrl methods instead of a custom one! return RedirectSafely(returnUrl, returnUrlHash); } + + [UnitOfWork] + public virtual IActionResult OnPostExternalLogin(string provider, string returnUrl = null) + { + // Request a redirect to the external login provider. + var redirectUrl = Url.Page("./Login", pageHandler: "ExternalLoginCallback", values: new { returnUrl }); + var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl); + return new ChallengeResult(provider, properties); + } + + [UnitOfWork] + public virtual async Task OnGetExternalLoginCallbackAsync(string returnUrl = null, string returnUrlHash = "", string remoteError = null) + { + if (remoteError != null) + { + return RedirectToPage("./Login"); + } + + var info = await _signInManager.GetExternalLoginInfoAsync(); + if (info == null) + { + return RedirectToPage("./Login"); + } + + // Sign in the user with this external login provider if the user already has a login. + var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true); + if (result.Succeeded) + { + return RedirectSafely(returnUrl, returnUrlHash); + } + + if (result.IsLockedOut) + { + throw new UserFriendlyException("Cannot proceed because user is locked out!"); + } + + ReturnUrl = returnUrl; + + //User does not have an account, create an account. + await CreateUserAsync(); + return RedirectSafely(returnUrl, returnUrlHash); + } + + [UnitOfWork] + protected virtual async Task CreateUserAsync() + { + ValidateModel(); + + // Get the information about the user from the external login provider + var info = await _signInManager.GetExternalLoginInfoAsync(); + if (info == null) + { + throw new ApplicationException("Error loading external login information during confirmation."); + } + + var emailAddress = info.Principal.FindFirstValue(ClaimTypes.Email); + + var user = new IdentityUser(GuidGenerator.Create(), emailAddress); + + CheckIdentityErrors(await _userManager.CreateAsync(user)); + CheckIdentityErrors(await _userManager.SetEmailAsync(user, emailAddress)); + CheckIdentityErrors(await _userManager.AddLoginAsync(user, info)); + + await _signInManager.SignInAsync(user, false); + } public class PostInput {