После изучения некоторых руководств я пришел к следующему выводу. Проблема сейчас заключается в том, что URL-адрес меняется только после нажатия кнопки входа в систему. Я перепробовал все, что нашел в сети, и все еще застрял в этой проблеме. Простите, если это может быть пост для новичка, поскольку я только сегодня начал его изучать.
Program.cs:
using BCrypt.Net;
using HrisClient.Components;
using HrisClient.Data;
using HrisClient.Services;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Components;
using Microsoft.EntityFrameworkCore;
using System.Security.Claims;
using LoginRequest = HrisClient.Models.LoginRequest;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
builder.Services.AddScoped(sp =>
{
var nav = sp.GetRequiredService();
return new HttpClient
{
BaseAddress = new Uri(nav.BaseUri)
};
});
builder.Services.AddDbContext(options =>
options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection")));
builder.Services.AddHttpContextAccessor();
builder.Services.AddScoped();
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/login";
});
builder.Services.AddAuthorization();
builder.Services.AddCascadingAuthenticationState();
var app = builder.Build();
app.UseStaticFiles();
app.UseRouting(); //
app.UseAuthentication();
app.UseAuthorization();
app.UseAntiforgery();
app.MapRazorComponents()
.AddInteractiveServerRenderMode();
app.MapPost("/auth/login", async (
HttpContext http,
AppDbContext db,
LoginRequest request) =>
{
var user = await db.Users
.FirstOrDefaultAsync(x => x.UserUsername == request.Username);
if (user == null)
return Results.Unauthorized();
if (!BCrypt.Net.BCrypt.Verify(request.Password, user.UserPassword))
return Results.Unauthorized();
var claims = new List
{
new Claim(ClaimTypes.Name, user.UserUsername),
new Claim("UserPslId", user.UserPslId?.ToString() ?? "")
};
var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var principal = new ClaimsPrincipal(identity);
await http.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
principal);
return Results.Ok();
});
app.Run();
Login.cs:
@page "/login"
@layout LoginLayout
@using HrisClient.Services
@inject AuthService Auth
@inject NavigationManager Nav
@inject HttpClient Http
@rendermode InteractiveServer
HRIS Login
LOGIN PAGE LOADED
HRIS Login
Sign in to continue
Login
@if (!string.IsNullOrEmpty(error))
{
@error
}
@error
@code {
string username = "";
string password = "";
string? error;
async Task LoginUser()
{
error = null;
var response = await Http.PostAsJsonAsync("/auth/login", new
{
Username = username,
Password = password
});
if (response.IsSuccessStatusCode)
{
Nav.NavigateTo("/dashboard", forceLoad: false);
}
else
{
error = "Invalid username or password";
}
}
}
Dashboard.cs:
@page "/dashboard"
@using HrisClient.Services
@attribute [Microsoft.AspNetCore.Authorization.Authorize]
@inject AuthService Auth
@inject NavigationManager Nav
DASHBOARD LOADED
Мобильная версия