반응형
브라우저의 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)));
}
}
}
'프로그래밍 > C#' 카테고리의 다른 글
P/Invoke란 무엇인가? (48) | 2023.05.19 |
---|---|
C# 단정밀도(Single Precision), 배정밀도(Double Precision)에 대해서 (7) | 2023.05.11 |
C# 히트맵(HeatMap) 그리기 (4) | 2023.05.08 |
C# 날짜 서식 지정자(Datetime Format Specifier)에 대해서 (6) | 2023.05.04 |
C# 미리 정의된 Delegate에 대해서 (18) | 2023.04.26 |
댓글