Одной из проблем на стороне Blazor Server являются его службы Singleton и Scoped, его синглтон распределяется между всеми пользователями, заставляя его работать как кеш, и служба scoped теряется при обновлении sh, я решил эту проблему, чтобы получить Служба Singleton, которая не используется совместно, как показано ниже: Сначала нам нужны две службы:
namespace BlazorStore9.Services
{
public class MZSingleton
{
public Dictionary<Guid, Cart> Carts { get; set; } = new Dictionary<Guid, Cart>();
}
public class MZScopedSessionID
{
public Guid SessionID { get; set; }
}
}
Затем зарегистрируйте их как Singleton и Scoped соответственно, и добавьте их на страницы макета и другие страницы или компоненты, которые в этом нуждаются, Ниже приведена страница макета, которая сохраняет и извлекает sessionID с использованием локального хранилища:
@inject IJsInterop jsInterop
@inject MZSingleton mzSingleton
@inject MZScopedSessionID sessionID
@code
{
private BlazorStore9.Services.Cart cart = null;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await base.OnAfterRenderAsync(firstRender);
#region some imp codes
if (firstRender)
{
string SessionIDString = await jsInterop.GetAccessToken("SessionID");
if (string.IsNullOrEmpty(SessionIDString) || !Guid.TryParse(SessionIDString, out Guid theGuid))
{
Guid id = Guid.NewGuid();
await jsInterop.SaveAccessToken("SessionID", id.ToString());
sessionID.SessionID = id;
mzSingleton.Carts[sessionID.SessionID] = new Cart();
}
else
{
sessionID.SessionID = Guid.Parse(SessionIDString);
if (!mzSingleton.Carts.ContainsKey(sessionID.SessionID))
mzSingleton.Carts[sessionID.SessionID] = new Cart();
}
cart = mzSingleton.Carts[sessionID.SessionID];
}
}
Затем на каждой странице или компоненте мы имеем:
@inject MZSingleton mzSingleton
@inject MZScopedSessionID sessionID
@code
{
private Cart cart = null;
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
cart = mzSingleton.Carts[sessionID.SessionID];
}
}
Мой вопрос: если этот подход безопасно для использования в целях аутентификации? Здесь я показал только корзину покупок, которая не может быть безопасной, но что для целей аутентификации?