* Added Authentication
This commit is contained in:
165
OrdersManagement/Components/Pages/Admin/Users/LoginModule.razor
Normal file
165
OrdersManagement/Components/Pages/Admin/Users/LoginModule.razor
Normal file
@@ -0,0 +1,165 @@
|
||||
@page "/login"
|
||||
@using Microsoft.AspNetCore.Components.Authorization
|
||||
@using OrdersManagement.Models
|
||||
@using Syncfusion.Blazor.Inputs
|
||||
@using Syncfusion.Blazor.Buttons
|
||||
@using Syncfusion.Blazor.Cards
|
||||
@inject UserService UserService
|
||||
@inject NavigationManager NavigationManager
|
||||
@inject AuthenticationStateProvider AuthenticationStateProvider
|
||||
|
||||
<div class="h-100 d-flex flex-column">
|
||||
<h5>Logowanie</h5>
|
||||
|
||||
@if (!string.IsNullOrEmpty(TempPassword))
|
||||
{
|
||||
<div class="alert alert-info">
|
||||
Twoje tymczasowe hasło to: <strong>@TempPassword</strong>. Użyj go do pierwszego logowania.
|
||||
</div>
|
||||
}
|
||||
|
||||
<SfCard>
|
||||
<CardHeader Title="Zaloguj się"/>
|
||||
<CardContent>
|
||||
<EditForm Model="@LoginModel" FormName="LoginForm" OnValidSubmit="@HandleLogin">
|
||||
<DataAnnotationsValidator/>
|
||||
<ValidationSummary/>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="login">Login</label>
|
||||
<SfTextBox ID="login" @bind-Value="LoginModel.Login" Placeholder="Wprowadź login"
|
||||
CssClass="e-outline"/>
|
||||
<ValidationMessage For="@(() => LoginModel.Login)"/>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="password">Hasło</label>
|
||||
<SfTextBox ID="password" Type="InputType.Password" @bind-Value="LoginModel.Password"
|
||||
Placeholder="Wprowadź hasło" CssClass="e-outline"/>
|
||||
<ValidationMessage For="@(() => LoginModel.Password)"/>
|
||||
</div>
|
||||
|
||||
<div class="form-group mt-3">
|
||||
<SfButton CssClass="e-primary" IsPrimary="true" Type="submit">Zaloguj</SfButton>
|
||||
</div>
|
||||
|
||||
@if (!string.IsNullOrEmpty(ErrorMessage))
|
||||
{
|
||||
<div class="alert alert-danger mt-3">@ErrorMessage</div>
|
||||
}
|
||||
</EditForm>
|
||||
|
||||
@if (ShowChangePassword)
|
||||
{
|
||||
<hr/>
|
||||
<h5>Zmień hasło</h5>
|
||||
<EditForm Model="@ChangePasswordModel" FormName="ChangePasswordForm"
|
||||
OnValidSubmit="@HandleChangePassword">
|
||||
<DataAnnotationsValidator/>
|
||||
<ValidationSummary/>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="newPassword">Nowe hasło</label>
|
||||
<SfTextBox ID="newPassword" Type="InputType.Password"
|
||||
@bind-Value="ChangePasswordModel.NewPassword" Placeholder="Wprowadź nowe hasło"
|
||||
CssClass="e-outline"/>
|
||||
<ValidationMessage For="@(() => ChangePasswordModel.NewPassword)"/>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="confirmPassword">Potwierdź hasło</label>
|
||||
<SfTextBox ID="confirmPassword" Type="InputType.Password"
|
||||
@bind-Value="ChangePasswordModel.ConfirmPassword" Placeholder="Potwierdź nowe hasło"
|
||||
CssClass="e-outline"/>
|
||||
<ValidationMessage For="@(() => ChangePasswordModel.ConfirmPassword)"/>
|
||||
</div>
|
||||
|
||||
<div class="form-group mt-3">
|
||||
<SfButton CssClass="e-success" Type="submit">Zmień hasło</SfButton>
|
||||
</div>
|
||||
</EditForm>
|
||||
}
|
||||
</CardContent>
|
||||
</SfCard>
|
||||
|
||||
</div>
|
||||
|
||||
@code {
|
||||
private LoginModel LoginModel { get; set; } = new();
|
||||
private ChangePasswordModel ChangePasswordModel { get; set; } = new();
|
||||
private bool ShowChangePassword { get; set; }
|
||||
private string TempPassword { get; set; }
|
||||
private string ErrorMessage { get; set; }
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
TempPassword = NavigationManager.Uri.Split('?').Length > 1 ? Uri.UnescapeDataString(NavigationManager.Uri.Split('=')[1]) : null;
|
||||
}
|
||||
|
||||
private async Task HandleLogin()
|
||||
{
|
||||
try
|
||||
{
|
||||
Console.WriteLine($"Próba logowania dla: {LoginModel.Login}");
|
||||
var user = await UserService.AuthenticateUserAsync(LoginModel.Login, LoginModel.Password);
|
||||
if (user != null)
|
||||
{
|
||||
Console.WriteLine($"Użytkownik {user.Login} znaleziony.");
|
||||
if (user.IsTemporaryPassword)
|
||||
{
|
||||
ShowChangePassword = true;
|
||||
StateHasChanged(); // Wymagane, aby odświeżyć UI
|
||||
}
|
||||
else
|
||||
{
|
||||
await ((CustomAuthenticationStateProvider)AuthenticationStateProvider).MarkUserAsAuthenticated(user);
|
||||
NavigationManager.NavigateTo("/");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ErrorMessage = "Nieprawidłowy login lub hasło";
|
||||
Console.WriteLine(ErrorMessage);
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ErrorMessage = $"Błąd logowania: {ex.Message}";
|
||||
Console.WriteLine(ErrorMessage);
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private async Task HandleChangePassword()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (ChangePasswordModel.NewPassword == ChangePasswordModel.ConfirmPassword)
|
||||
{
|
||||
var user = await UserService.GetUserByUsernameAsync(LoginModel.Login);
|
||||
if (user != null)
|
||||
{
|
||||
user.PasswordHash = BCrypt.Net.BCrypt.HashPassword(ChangePasswordModel.NewPassword);
|
||||
user.IsTemporaryPassword = false;
|
||||
await UserService.UpdateUserAsync(user);
|
||||
ShowChangePassword = false;
|
||||
LoginModel = new LoginModel();
|
||||
StateHasChanged();
|
||||
NavigationManager.NavigateTo("/login");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ErrorMessage = "Hasła nie są zgodne";
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ErrorMessage = $"Błąd zmiany hasła: {ex.Message}";
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
@page "/register"
|
||||
@using OrdersManagement.Models
|
||||
@using OrdersManagementDataModel.Dtos
|
||||
@using Syncfusion.Blazor.Inputs
|
||||
@using Syncfusion.Blazor.Buttons
|
||||
@using Syncfusion.Blazor.Cards
|
||||
|
||||
@inject UserService UserService
|
||||
@inject NavigationManager NavigationManager
|
||||
|
||||
<div class="h-100 d-flex flex-column">
|
||||
<h5>Rejestracja</h5>
|
||||
<br/>
|
||||
<SfCard>
|
||||
<CardHeader Title="Zarejestruj się"/>
|
||||
<CardContent>
|
||||
<EditForm Model="@RegisterModel" OnValidSubmit="HandleRegister">
|
||||
<DataAnnotationsValidator/>
|
||||
<ValidationSummary/>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="login">Login</label>
|
||||
<SfTextBox ID="login" @bind-Value="RegisterModel.Login" Placeholder="Wprowadź login"
|
||||
CssClass="e-outline"/>
|
||||
<ValidationMessage For="@(() => RegisterModel.Login)"/>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="email">Email</label>
|
||||
<SfTextBox ID="email" @bind-Value="RegisterModel.Email" Placeholder="Wprowadź email"
|
||||
CssClass="e-outline"/>
|
||||
<ValidationMessage For="@(() => RegisterModel.Email)"/>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="firstName">Imię</label>
|
||||
<SfTextBox ID="firstName" @bind-Value="RegisterModel.FirstName" Placeholder="Wprowadź imię"
|
||||
CssClass="e-outline"/>
|
||||
<ValidationMessage For="@(() => RegisterModel.FirstName)"/>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="lastName">Nazwisko</label>
|
||||
<SfTextBox ID="lastName" @bind-Value="RegisterModel.LastName" Placeholder="Wprowadź nazwisko"
|
||||
CssClass="e-outline"/>
|
||||
<ValidationMessage For="@(() => RegisterModel.LastName)"/>
|
||||
</div>
|
||||
|
||||
<div class="form-group mt-3">
|
||||
<SfButton CssClass="e-primary" IsPrimary="true" Type="submit">Zarejestruj</SfButton>
|
||||
</div>
|
||||
</EditForm>
|
||||
</CardContent>
|
||||
</SfCard>
|
||||
</div>
|
||||
|
||||
@code {
|
||||
private RegisterModel RegisterModel { get; set; } = new();
|
||||
|
||||
private async Task HandleRegister()
|
||||
{
|
||||
var temporaryPassword = Guid.NewGuid().ToString().Substring(0, 8);
|
||||
var passwordHash = BCrypt.Net.BCrypt.HashPassword(temporaryPassword);
|
||||
|
||||
var user = new UserDto
|
||||
{
|
||||
Login = RegisterModel.Login,
|
||||
PasswordHash = passwordHash,
|
||||
IsTemporaryPassword = true,
|
||||
IsActive = true,
|
||||
ActiveFrom = DateTime.Now,
|
||||
Email = RegisterModel.Email,
|
||||
FirstName = RegisterModel.FirstName,
|
||||
LastName = RegisterModel.LastName,
|
||||
CreatedDate = DateTime.Now,
|
||||
RowPointer = Guid.NewGuid()
|
||||
};
|
||||
|
||||
var result = await UserService.AddUserAsync(user);
|
||||
|
||||
if (result.IsSuccessStatusCode)
|
||||
{
|
||||
NavigationManager.NavigateTo($"/login?tempPassword={Uri.EscapeDataString(temporaryPassword)}");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -21,8 +21,7 @@
|
||||
<GridColumn Field="@nameof(UserDto.IsActive)" HeaderText="Aktywny" Width="80"></GridColumn>
|
||||
<GridColumn Field="@nameof(UserDto.CreatedDate)" HeaderText="Utworzono" Format="d" Width="120"></GridColumn>
|
||||
</GridColumns>
|
||||
<GridEditSettings AllowDeleting="true" ShowDeleteConfirmDialog="true" AllowAdding="true" AllowEditing="true"
|
||||
Mode="EditMode.Normal"></GridEditSettings>
|
||||
<GridEditSettings AllowDeleting="true" ShowDeleteConfirmDialog="true" AllowAdding="true" NewRowPosition="NewRowPosition.Bottom" AllowEditing="true"></GridEditSettings>
|
||||
<GridEvents OnActionBegin="UserActionBegin" OnActionComplete="UserActionComplete" TValue="UserDto"></GridEvents>
|
||||
</SfGrid>§
|
||||
<br/>
|
||||
@@ -169,5 +168,4 @@
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user