@page "/login" @layout AuthLayout @using Microsoft.AspNetCore.Authentication @using Microsoft.AspNetCore.Identity @inject SignInManager SignInManager @inject NavigationManager Navigation @inject IAuthenticationSchemeProvider SchemeProvider Budgeteer Beta — Sign In
💰

Budgeteer beta

Sign in to your account

@if (!string.IsNullOrEmpty(errorMessage)) {
@errorMessage
}
@if (externalProviders.Count > 0) {

Or sign in with

@foreach (var provider in externalProviders) {
}
}

Don't have an account? Register

@code { [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(""), "GitHub" => 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; } }