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
- {
-
- }
- }
-
-
+
+
+ }
\ 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
{