Я пишу серверное приложение Blazor ASP.NET Core 8.0. Я использую Microsoft Identity Framework Core для авторизации. Он загружает пункты меню только после успешного входа пользователя в систему. Я использовал следующий сценарий авторизации на обоих
using GetTutorsOnline.Data;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Server;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options;
using System.Security.Claims;
namespace GetTutorsOnline.Components.Account
{
// This is a server-side AuthenticationStateProvider that revalidates the security stamp for the connected user
// every 30 minutes an interactive circuit is connected.
internal sealed class IdentityRevalidatingAuthenticationStateProvider(
ILoggerFactory loggerFactory,
IServiceScopeFactory scopeFactory,
IOptions options)
: RevalidatingServerAuthenticationStateProvider(loggerFactory)
{
protected override TimeSpan RevalidationInterval => TimeSpan.FromMinutes(30);
protected override async Task ValidateAuthenticationStateAsync(
AuthenticationState authenticationState, CancellationToken cancellationToken)
{
// Get the user manager from a new scope to ensure it fetches fresh data
await using var scope = scopeFactory.CreateAsyncScope();
var userManager = scope.ServiceProvider.GetRequiredService();
return await ValidateSecurityStampAsync(userManager, authenticationState.User);
}
private async Task ValidateSecurityStampAsync(UserManager userManager, ClaimsPrincipal principal)
{
var user = await userManager.GetUserAsync(principal);
if (user is null)
{
return false;
}
else if (!userManager.SupportsUserSecurityStamp)
{
return true;
}
else
{
var principalStamp = principal.FindFirstValue(options.Value.ClaimsIdentity.SecurityStampClaimType);
var userStamp = await userManager.GetSecurityStampAsync(user);
return principalStamp == userStamp;
}
}
}
}
Я пишу серверное приложение Blazor ASP.NET Core 8.0. Я использую Microsoft Identity Framework Core для авторизации. Он загружает пункты меню только после успешного входа пользователя в систему. Я использовал следующий сценарий авторизации на обоих[code]NavMenu.razor[/code] and [code]Home.razor[/code] components. [code]
........
[/code] When app loads, it asks for login. At successful login, it displays the menu items in the [code]sidebar[/code]. Когда я выполняю операцию отправки на любой из страниц, все пункты меню исчезают и снова отображается страница входа. Вот моя[code]program.cs[/code] code: [code]using GetTutorsOnline.Components; using GetTutorsOnline.Components.Account; using GetTutorsOnline.Data; using GTO.IModels.IModelRepos; using GTO.Infrastructure.Data; using GTO.Infrastructure.Repositories; using Microsoft.AspNetCore.Antiforgery; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
app.Run(); [/code] Below is the code of [code]IdentityRevalidatingAuthenticationStateProvider[/code] class [code]using GetTutorsOnline.Data; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Components.Server; using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Options; using System.Security.Claims;
namespace GetTutorsOnline.Components.Account { // This is a server-side AuthenticationStateProvider that revalidates the security stamp for the connected user // every 30 minutes an interactive circuit is connected. internal sealed class IdentityRevalidatingAuthenticationStateProvider( ILoggerFactory loggerFactory, IServiceScopeFactory scopeFactory, IOptions options) : RevalidatingServerAuthenticationStateProvider(loggerFactory) { protected override TimeSpan RevalidationInterval => TimeSpan.FromMinutes(30);
protected override async Task ValidateAuthenticationStateAsync( AuthenticationState authenticationState, CancellationToken cancellationToken) { // Get the user manager from a new scope to ensure it fetches fresh data await using var scope = scopeFactory.CreateAsyncScope(); var userManager = scope.ServiceProvider.GetRequiredService(); return await ValidateSecurityStampAsync(userManager, authenticationState.User); }
private async Task ValidateSecurityStampAsync(UserManager userManager, ClaimsPrincipal principal) { var user = await userManager.GetUserAsync(principal); if (user is null) { return false; } else if (!userManager.SupportsUserSecurityStamp) { return true; } else { var principalStamp = principal.FindFirstValue(options.Value.ClaimsIdentity.SecurityStampClaimType); var userStamp = await userManager.GetSecurityStampAsync(user); return principalStamp == userStamp; } } } }
Я знаю, что WebAssebly предназначен для клиентской стороны, а Server — для серверной соответственно, но я не совсем понимаю, зачем нам нужно веб-приложение, если у нас уже есть ранее упомянутые шаблоны.
Они также добавили в WebAssembly слово...
Мне нужно получить путь к файлу, который пользователь выбирает в событии , чтобы отправить файл в API с помощью FluentFTP. Я использую FTP для загрузки файла на сервер. следуйте примеру:
// create an FTP client and specify the host, username and...
Мне нужно получить путь к файлу, который пользователь выбирает в событии , чтобы отправить файл в API с помощью FluentFTP. Я использую FTP для загрузки файла на сервер. следуйте примеру:
// create an FTP client and specify the host, username and...
Мне нужно получить путь к файлу, который пользователь выбирает в событии , чтобы отправить файл в API с помощью FluentFTP. Я использую FTP для загрузки файла на сервер. следуйте примеру:
// create an FTP client and specify the host, username and...
У меня есть зона перетаскивания файлов, реализованная на одной из страниц моего приложения blazor, которая обрабатывается с помощью интерфейса среды выполнения JavaScript. Чтобы избежать утечек памяти, у меня есть метод javascript, который удаляет...