본문 바로가기
프로그래밍/C#

C# ProtectedSessionStorage 클래스

by bantomak 2023. 5. 10.

 

브라우저의 SessionStorage 컬렉션에 데이터를 저장하고 검색하는 기능을 제공한다.

 

SessionStorage는 LocalSotrage와 비슷하지만 LocalStorage의 데이터는 만료되지 않고 SessionStorage의 데이터는 페이지 세션이 끝날 때 함께 제거되는 차이가 있다.

 

  • 페이지 세션은 브라우저가 열려있는 한 새로고침과 페이지 복구를 거쳐도 남아있다.
  • 페이지를 새로운 탭이나 창에서 열면, 세션 쿠키의 동작과는 다르게 최상위 브라우징 맥락의 값을 가진 새로운 세션을 생성한다.
  • 같은 URL을 다수의 탭/창에서 열면 각각의 탭/창에 대해 새로운 SessionStorage를 생성한다.
  • 탭/창을 닫으면 세션이 끝나고 SessionStorage 안의 객체를 초기화한다.

 

주요 함수

public ValueTask DeleteAsync(string key);
public ValueTask<ProtectedBrowserStorageResult<TValue>> GetAsync<TValue>(string key);
public ValueTask<ProtectedBrowserStorageResult<TValue>> GetAsync<TValue>(string purpose, string key);
public ValueTask SetAsync(string key, object value);
public ValueTask SetAsync(string purpose, string key, object value);

 

예제 코드

using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage;
using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;

namespace NewGameTool.Authentication
{
    public class CustomAuthenticationStateProvider : AuthenticationStateProvider
    {
        private readonly ProtectedSessionStorage _sessionStorage;
        private ClaimsPrincipal _annoymous = new ClaimsPrincipal(new ClaimsIdentity());

        public CustomAuthenticationStateProvider(ProtectedSessionStorage sessionStorage)
        {
            _sessionStorage = sessionStorage;
        }

        public override async Task<AuthenticationState> GetAuthenticationStateAsync()
        {
            try
            {
                var userSessionStorageResult = await _sessionStorage.GetAsync<UserSession>("UserSession");
                var userSession = userSessionStorageResult.Success ? userSessionStorageResult.Value : null;

                if (userSession == null)
                {
                    return await Task.FromResult(new AuthenticationState(_annoymous));
                }

                var claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(new List<Claim>
                {
                    new Claim(ClaimTypes.Name, userSession.UserName),
                    new Claim(ClaimTypes.Role, userSession.Role)
                }, "CustomAuth"));

                return await Task.FromResult(new AuthenticationState(claimsPrincipal));
            }
            catch
            {
                return await Task.FromResult(new AuthenticationState(_annoymous));
            }
        }

        public async Task UpdateAuthenticationState(UserSession userSession)
        {
            ClaimsPrincipal claimsPrincipal;

            if (userSession != null)
            {
                await _sessionStorage.SetAsync("UserSession", userSession);
                claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(new List<Claim>
                {
                    new Claim(ClaimTypes.Name, userSession.UserName),
                    new Claim(ClaimTypes.Role, userSession.Role)
                }));
            }
            else
            {
                await _sessionStorage.DeleteAsync("UserSession");
                claimsPrincipal = _annoymous;
            }

            NotifyAuthenticationStateChanged(Task.FromResult(new AuthenticationState(claimsPrincipal)));
        }
    }
}

 

session
실제 웹사이트 세션 저장소에 저장된 세션 정보

댓글