-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathLogin.cshtml.cs
More file actions
132 lines (110 loc) · 4.92 KB
/
Copy pathLogin.cshtml.cs
File metadata and controls
132 lines (110 loc) · 4.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
using System.ComponentModel.DataAnnotations;
using EssentialCSharp.Web.Areas.Identity.Data;
using EssentialCSharp.Web.Services;
using EssentialCSharp.Web.Services.Referrals;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Options;
namespace EssentialCSharp.Web.Areas.Identity.Pages.Account;
public partial class LoginModel(SignInManager<EssentialCSharpWebUser> signInManager, UserManager<EssentialCSharpWebUser> userManager, ILogger<LoginModel> logger, IReferralService referralService, ICaptchaValidationService captchaValidationService, IOptions<CaptchaOptions> optionsAccessor) : PageModel
{
private InputModel? _Input;
[BindProperty]
public InputModel Input
{
get => _Input!;
set => _Input = value ?? throw new ArgumentNullException(nameof(value));
}
public IList<AuthenticationScheme>? ExternalLogins { get; set; }
public string? ReturnUrl { get; set; }
public string CaptchaSiteKey { get; } = optionsAccessor.Value.SiteKey ?? string.Empty;
[TempData]
public string? ErrorMessage { get; set; }
public class InputModel
{
[Required]
[EmailAddress]
public string? Email { get; set; }
[Required]
[MaxLength(PasswordRequirementOptions.PasswordMaximumLength)]
[DataType(DataType.Password)]
public string? Password { get; set; }
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
public async Task OnGetAsync(string? returnUrl = null)
{
if (!string.IsNullOrEmpty(ErrorMessage))
{
ModelState.AddModelError(string.Empty, ErrorMessage);
}
returnUrl ??= Url.Content("~/");
// Clear the existing external cookie to ensure a clean login process
await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
ExternalLogins = (await signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
ReturnUrl = returnUrl;
}
public async Task<IActionResult> OnPostAsync(string? returnUrl = null)
{
returnUrl ??= Url.Content("~/");
string? captchaToken = Request.Form[CaptchaOptions.HttpPostResponseKeyName];
CaptchaValidationResult captchaResult = await captchaValidationService.ValidateAsync(captchaToken, HttpContext.Connection.RemoteIpAddress?.ToString());
if (!captchaResult.ShouldProceed)
{
ModelState.AddModelError(string.Empty, "Human verification failed. Please try again.");
ExternalLogins = (await signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
return Page();
}
ExternalLogins = (await signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
if (ModelState.IsValid)
{
Microsoft.AspNetCore.Identity.SignInResult result;
if (Input.Email is null)
{
return RedirectToPage(Url.Content("~/"), new { ReturnUrl = returnUrl });
}
EssentialCSharpWebUser? foundUser = await userManager.FindByEmailAsync(Input.Email);
if (Input.Password is null)
{
return RedirectToPage(Url.Content("~/"), new { ReturnUrl = returnUrl });
}
if (foundUser is not null)
{
result = await signInManager.PasswordSignInAsync(foundUser, Input.Password, Input.RememberMe, lockoutOnFailure: true);
// Call the referral service to get the referral ID and set it onto the user claim
_ = await referralService.EnsureReferralIdAsync(foundUser);
}
else
{
result = await signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true);
}
if (result.Succeeded)
{
LogUserLoggedIn(logger);
return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
}
if (result.IsLockedOut)
{
LogUserAccountLockedOut(logger);
return RedirectToPage("./Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
}
}
// If we got this far, something failed, redisplay form
return Page();
}
[LoggerMessage(Level = LogLevel.Information, Message = "User logged in.")]
private static partial void LogUserLoggedIn(ILogger<LoginModel> logger);
[LoggerMessage(Level = LogLevel.Warning, Message = "User account locked out.")]
private static partial void LogUserAccountLockedOut(ILogger<LoginModel> logger);
}