Skip to content

Commit

Permalink
WIP: add login information
Browse files Browse the repository at this point in the history
  • Loading branch information
neozhu committed Aug 31, 2021
1 parent 414c911 commit a9d4d61
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 74 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -82,13 +82,19 @@ public async Task<IActionResult> OnPostAsync(string returnUrl = null)
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var userName = Input.UserName;
var user = await _userManager.FindByNameAsync(userName);
if (user == null)
{
ModelState.AddModelError(string.Empty, "Not found user.");
return Page();
}
var lockoutresult = await _userManager.SetLockoutEndDateAsync(user, System.DateTimeOffset.Now.AddMinutes(-1));
if (lockoutresult.Succeeded)
{
var result = await _signInManager.PasswordSignInAsync(userName, Input.Password, true, lockoutOnFailure: true);

if (result.Succeeded)
{
await _userManager.AddLoginAsync(user, new UserLoginInfo("UserNamePassword", user.Id, "Account/Lockout"));
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
Expand Down
150 changes: 76 additions & 74 deletions src/SmartAdmin.WebUI/Areas/Identity/Pages/Account/Login.cshtml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,96 +12,98 @@

namespace SmartAdmin.WebUI.Areas.Identity.Pages.Account
{
[AllowAnonymous]
public class LoginModel : PageModel
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly SignInManager<ApplicationUser> _signInManager;

private readonly ILogger<LoginModel> _logger;

public LoginModel(
UserManager<ApplicationUser> userManager,
SignInManager<ApplicationUser> signInManager,
ILogger<LoginModel> logger)
[AllowAnonymous]
public class LoginModel : PageModel
{
_userManager = userManager;
_signInManager = signInManager;
_logger = logger;
}
private readonly UserManager<ApplicationUser> _userManager;
private readonly SignInManager<ApplicationUser> _signInManager;

[BindProperty]
public InputModel Input { get; set; }
private readonly ILogger<LoginModel> _logger;

public IList<AuthenticationScheme> ExternalLogins { get; set; }
public LoginModel(
UserManager<ApplicationUser> userManager,
SignInManager<ApplicationUser> signInManager,
ILogger<LoginModel> logger)
{
_userManager = userManager;
_signInManager = signInManager;
_logger = logger;
}

public string ReturnUrl { get; set; }
[BindProperty]
public InputModel Input { get; set; }

[TempData]
public string ErrorMessage { get; set; }
public IList<AuthenticationScheme> ExternalLogins { get; set; }

public class InputModel
{
[Required]
public string UserName { get; set; }
public string ReturnUrl { get; set; }

[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
[TempData]
public string ErrorMessage { get; set; }

[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
public class InputModel
{
[Required]
public string UserName { get; set; }

public async Task OnGetAsync(string returnUrl = null)
{
if (!string.IsNullOrEmpty(ErrorMessage))
{
ModelState.AddModelError(string.Empty, ErrorMessage);
}
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }

returnUrl = returnUrl ?? Url.Content("~/");
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}

// Clear the existing external cookie to ensure a clean login process
await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
public async Task OnGetAsync(string returnUrl = null)
{
if (!string.IsNullOrEmpty(ErrorMessage))
{
ModelState.AddModelError(string.Empty, ErrorMessage);
}

ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
returnUrl = returnUrl ?? Url.Content("~/");

ReturnUrl = returnUrl;
}
// Clear the existing external cookie to ensure a clean login process
await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");

if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(Input.UserName, Input.Password, Input.RememberMe, lockoutOnFailure: true);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout",new {userName= Input.UserName, ReturnUrl = returnUrl });
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();

ReturnUrl = returnUrl;
}
else

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
returnUrl = returnUrl ?? Url.Content("~/");

if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(Input.UserName, Input.Password, Input.RememberMe, lockoutOnFailure: true);
if (result.Succeeded)
{
var user = await _userManager.FindByNameAsync(Input.UserName);
await _userManager.AddLoginAsync(user, new UserLoginInfo("UserNamePassword", user.Id, "Account/Login"));
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout", new { userName = Input.UserName, ReturnUrl = returnUrl });
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
}
}

// If we got this far, something failed, redisplay form
return Page();
}
}

// If we got this far, something failed, redisplay form
return Page();
}
}
}

0 comments on commit a9d4d61

Please sign in to comment.