Мне интересно, есть ли лучшая практика или стандартный способ управления моими пользовательскими данными с данными претензий.
Сценарий: пользователи входят в систему с использованием стороннего поставщика и перенаправляются обратно в мое приложение. Все, что у меня есть на данный момент, - это идентификатор, который отображается на профиль пользователя в нашей базе данных. Угловое приложение будет отправлять запросы к конечному интерфейсу API.
Поэтому мне интересно, куда поместить (скажем,) роли и флаги, которые пользователь имеет в нашей базе данных для ограничения доступа к маршруту и других вещей.
Полагаю, я мог бы получать его при каждом запросе, но я вижу, что это добавляет некоторые накладные расходы.
Итак, я полагаю, у меня есть несколько вариантов: добавить мои данные в сеанс, добавить мои данные текущему пользователю (ClaimsPrincipal) или используйте кэширование. Все они имеют компромиссы. Блокировки сеанса, кэширование также имеет проблемы с синхронизацией, выборка каждого запроса имеет задержку, материал ClaimsPrincipal кажется неуправляемым?
im, используя 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;
});
}
}