Мне интересно, есть ли лучший или стандартный способ управления моими пользовательскими данными с данными о претензиях.
Сценарий: пользователь входит в систему с использованием стороннего поставщика и перенаправляется обратно в мое приложение. Все, что у меня есть на данный момент, - это идентификатор, который соответствует профилю пользователя в нашей базе данных. Приложение angular будет делать запросы к внутреннему API.
Поэтому мне интересно, где разместить (скажем,) роли и флаги, которые пользователь имеет в нашей базе данных для ограничения доступа к маршрутам и других вещей.
Думаю, я мог бы получать его при каждом запросе, но я вижу, что это добавляет некоторые накладные расходы.
Итак, я полагаю, у меня есть несколько вариантов: добавить мои данные в сеанс, добавить мои данные текущему пользователю (ClaimsPrincipal) или использовать кеширование. У всех есть компромиссы. Блокировка сеанса, кеширование также имеет проблемы с синхронизацией, получение каждого запроса имеет задержку, материал ClaimsPrincipal кажется непослушным?
Я использую net framework 4.7
Ссылка на код https://github.com/ricardosaracino/SamlNet
public class UserHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
var currentUser = HttpContext.Current.User as ClaimsPrincipal;
var claims = currentUser?.Claims;
var nameIdentifierClaim = claims?.FirstOrDefault(claim => claim.Type == ClaimTypes.NameIdentifier);
var nameId = nameIdentifierClaim?.Value;
// if NOT cached or expired
// read from database
// set user in cache with nameid
// set request.Properties from cache
request.Properties["currentUser"] = new CurrentUser()
{
Id = Guid.NewGuid()
};
return base.SendAsync(request, cancellationToken).ContinueWith((task) =>
{
var a = request.Properties["currentUser"];
// if modified add back to cache
return task.Result;
});
}
}