Сеанс Like Singleton в Blazor на стороне сервера - PullRequest
0 голосов
/ 19 апреля 2020

Одной из проблем на стороне 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];
     }
}

Мой вопрос: если этот подход безопасно для использования в целях аутентификации? Здесь я показал только корзину покупок, которая не может быть безопасной, но что для целей аутентификации?

...