По умолчанию cookie содержит всю соответствующую информацию в зашифрованном виде, поэтому при вызове вашего API все, что вам нужно сделать, это расшифровать cookie и использовать эту информацию.
Однако, часто все хранится в cookieСамо по себе нежелательно, особенно если имеется много актуальной информации.Cookie отправляется с каждым запросом к вашему API, и если он большой - много (одной и той же) информации отправляется туда и обратно в основном бесплатно.Кроме того, как вы сами видите, размер cookie может стать ограничивающим фактором в некоторых средах.
Так что вместо отправки всей информации в самом cookie - вы можете хранить эту информацию где-то еще, например, в памяти сервера, и поместитьтолько идентификатор для этой информации в самом файле cookie.
Вы можете настроить хранилище для сессии следующим образом:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
}).AddCookie(o => o.SessionStore = new MemoryCacheTicketStore());
И пример реализации MemoryCacheTicketStore
можно найти на asp.net examples на github:
public class MemoryCacheTicketStore : ITicketStore
{
private const string KeyPrefix = "AuthSessionStore-";
private IMemoryCache _cache;
public MemoryCacheTicketStore()
{
_cache = new MemoryCache(new MemoryCacheOptions());
}
public async Task<string> StoreAsync(AuthenticationTicket ticket)
{
var guid = Guid.NewGuid();
var key = KeyPrefix + guid.ToString();
await RenewAsync(key, ticket);
return key;
}
public Task RenewAsync(string key, AuthenticationTicket ticket)
{
var options = new MemoryCacheEntryOptions();
var expiresUtc = ticket.Properties.ExpiresUtc;
if (expiresUtc.HasValue)
{
options.SetAbsoluteExpiration(expiresUtc.Value);
}
options.SetSlidingExpiration(TimeSpan.FromHours(1)); // TODO: configurable.
_cache.Set(key, ticket, options);
return Task.FromResult(0);
}
public Task<AuthenticationTicket> RetrieveAsync(string key)
{
AuthenticationTicket ticket;
_cache.TryGetValue(key, out ticket);
return Task.FromResult(ticket);
}
public Task RemoveAsync(string key)
{
_cache.Remove(key);
return Task.FromResult(0);
}
}