передовой опыт или стандартный способ управления моими аутентифицированными пользовательскими данными с данными претензий

Мне интересно, есть ли лучший или стандартный способ управления моими пользовательскими данными с данными о претензиях.

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


person Ricardo Saracino    schedule 10.10.2019    source источник
comment
Взгляните на мой ответ здесь для некоторые мысли.   -  person Ruard van Elburg    schedule 23.10.2019
comment
В конце концов я пошел с претензиями, и я могу сделать кое-что, чтобы установить файлы cookie с ними для моего приложения angular и использовать их для разрешений приложений github.com/ricardosaracino/SamlOwin/blob/master/SamlOwin/   -  person Ricardo Saracino    schedule 24.10.2019


Ответы (1)


В итоге я использовал Owin с файлом cookie приложения и претензиями. Я смог легко преобразовать их в файлы cookie для состояния клиента и использовать их для получения разрешений.

Хороший ответ здесь

Подходит ли авторизация на основе утверждений для отдельных ресурсов

person Ricardo Saracino    schedule 24.10.2019