* Added Authentication

This commit is contained in:
2025-02-21 09:59:50 +01:00
parent ed5b5634fd
commit 6774311433
20 changed files with 468 additions and 30 deletions

View 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();
}
}
}

View File

@@ -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)}");
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -1,8 +1,11 @@
@page "/EdiCustomerOrders"
@attribute [Authorize]
@inject EdiCustomerOrderService EdiCustomerOrderService
@inject NavigationManager NavigationManager
@using OrdersManagement.Dtos
@using Microsoft.AspNetCore.Authorization
@using OrdersManagement.Models
@using SytelineSaAppEfDataModel.Dtos
@using Syncfusion.Blazor.Grids
@using Syncfusion.Blazor.Cards
@@ -105,7 +108,7 @@
<Content>
@if (_responses.Any(x => x.Status == 1))
{
foreach (ResponseDto response in _responses.Where(x => x.Status == 1))
foreach (ResponseModel response in _responses.Where(x => x.Status == 1))
{
<p>Zamówienie EDI @response.Identifier zostało poprawnie zaksięgowane w Zamówieniach klienta pod
numerem '@response.ExternalIdentifier'</p>
@@ -113,7 +116,7 @@
}
@if (_responses.Any(x => x.Status == 0))
{
foreach (ResponseDto response in _responses.Where(x => x.Status == 0))
foreach (ResponseModel response in _responses.Where(x => x.Status == 0))
{
<p>Błąd: Zamówienie EDI @response.Identifier nie zostało poprawnie zaksięgowane w Zamówieniach
klienta.<br/>Lista błędów:<br/>@response.Message</p>
@@ -135,7 +138,7 @@
private IEnumerable<EdiCustomerOrderDto> _ediCustomerOrders = [];
private List<EdiCustomerOrderDto> _selectedEdiCustomerOrders = new();
private List<ResponseDto> _responses = new();
private List<ResponseModel> _responses = new();
private bool _isVisible;
private bool? _filter = false;
@@ -158,11 +161,11 @@
{
if (!_selectedEdiCustomerOrders.Any()) return false;
_responses = new List<ResponseDto>();
_responses = new List<ResponseModel>();
foreach (EdiCustomerOrderDto selectedEdiCustomerOrder in _selectedEdiCustomerOrders)
{
ResponseDto response = await EdiCustomerOrderService.SendOrderToSyteline(selectedEdiCustomerOrder.RowPointer, selectedEdiCustomerOrder.CustomerOrderNumber);
ResponseModel response = await EdiCustomerOrderService.SendOrderToSyteline(selectedEdiCustomerOrder.RowPointer, selectedEdiCustomerOrder.CustomerOrderNumber);
if (response.Status == 1)
{

View File

@@ -1,9 +1,14 @@
@page "/"
@attribute [Authorize]
@inherits LayoutComponentBase
@using Microsoft.AspNetCore.Authorization
@using OrdersManagement.Components.Pages.Shared
@using Syncfusion.Blazor.Grids
@inject ScheduleOrderService ScheduleOrderService
@inherits LayoutComponentBase
<div class="h-100 d-flex flex-column">
<h5>Zamówienia DELFOR</h5>