using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Identity; namespace BudgetApp.Components.Pages; public partial class Login { [SupplyParameterFromForm] private LoginModel Model { get; set; } = new(); private string? _errorMessage; private List _externalProviders = []; private string _antiforgeryToken = string.Empty; [CascadingParameter] private HttpContext? HttpContext { get; set; } protected override async Task OnInitializedAsync() { var schemes = await SchemeProvider.GetAllSchemesAsync(); _externalProviders = schemes .Where(s => !string.IsNullOrEmpty(s.DisplayName) && s.Name != IdentityConstants.ApplicationScheme && s.Name != IdentityConstants.ExternalScheme && s.Name != IdentityConstants.TwoFactorUserIdScheme && s.Name != IdentityConstants.TwoFactorRememberMeScheme) .ToList(); if (HttpContext is not null) { var tokens = HttpContext.RequestServices .GetRequiredService() .GetAndStoreTokens(HttpContext); _antiforgeryToken = tokens.RequestToken ?? string.Empty; } } private async Task HandleLogin() { _errorMessage = null; var result = await SignInManager.PasswordSignInAsync( Model.Email, Model.Password, isPersistent: false, lockoutOnFailure: false); if (result.Succeeded) { Navigation.NavigateTo("/", forceLoad: true); } else { _errorMessage = "Invalid email or password."; } } private static MarkupString GetProviderIcon(string provider) => provider switch { "Google" => new MarkupString( ""), "Microsoft" => new MarkupString( ""), "Facebook" => new MarkupString( ""), _ => new MarkupString("") }; private sealed class LoginModel { [System.ComponentModel.DataAnnotations.Required(ErrorMessage = "Email is required")] [System.ComponentModel.DataAnnotations.EmailAddress] public string Email { get; set; } = string.Empty; [System.ComponentModel.DataAnnotations.Required(ErrorMessage = "Password is required")] public string Password { get; set; } = string.Empty; } }