У меня есть веб-приложение сервера blazor и рабочий процесс .NET Core, оба они используют общий класс для доступа к данным (общая единица работы/общий репозиторий).
В базе данных я хотел бы регистрировать имена пользователей, которые вставляют или редактируют записи. Для этого я хочу внедрить ClaimsPrincipal в общие классы UoW и Repo).
Итак, я хотел бы иметь возможность извлекать текущий ClaimsPrincipal
в переходной службе с помощью внедрения зависимостей.
Для работника я могу внедрить ClaimsPrincipal с помощью следующего кода;
public static IServiceCollection CreateWorkerClaimsPrincipal(this IServiceCollection services, string workerName)
{
Claim workerNameClaim = new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name", workerName);
ClaimsIdentity identity = new ClaimsIdentity(
new System.Security.Claims.Claim[] { workerNameClaim },
"My-Worker-Authentication-Type",
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name",
"role");
ClaimsPrincipal principal = new ClaimsPrincipal(identity);
services.AddTransient<ClaimsPrincipal>(s => principal);
return services;
}
Это работает и удовлетворяет мои потребности.
Для веб-приложения сервера blazor мне нужно сделать что-то подобное.
Я считаю, что правильный способ извлечения ClaimsPrincipal
— через AuthenticationStateProvider
, однако для этого требуется вызов асинхронного метода GetAuthenticationStateAsync
.
ПРИМЕЧАНИЕ. Я не могу использовать IHttpContextAccessor
, так как это не работает со службой приложений Azure.
Я хочу что-то вроде;
public void ConfigureServices(IServiceCollection services)
{
/// ...
services.AddTransient<ClaimsPrincipal>(); // I think I need to do something here?
/// ...
}
Поэтому, когда я запрашиваю ClaimsPrincipal
через внедрение зависимостей, я хочу вернуть пользователя;
var authState = await AUthenticationStateProvider.GetAuthenticationStateAsync();
return authState.User;
Это возможно?
ClaimsPrincipal
в настоящее время и как вы хотите использовать, чтобы он не работал? - person Alexander   schedule 04.03.2021ClaimsPrincipal
для регистрации информации аудита о том, какие пользователи какие действия выполняют в моей БД. Все мои действия с БД выполняются через общий класс UnitOfWork, и я хотел бы вводить информацию о пользователе здесь, а не передавать ее из каждой вызывающей службы. У меня есть как веб-, так и рабочие процессы, обращающиеся к классу UoW, поэтому я не могу внедритьAuthenticationStateProvider
вместоClaimsPrincipal
. - person Mark Cooper   schedule 04.03.2021IHttpContextAccessor
не работает при развертывании приложения в Azure. Это так просто странно. Каждая обработка запроса использует только один и тот же контекст с именемHttpContext
, здесь нет многопоточности.HttpContext
— это одно место для хранения Пользователя (после аутентификации), поэтому, если вы создаете собственную службу с ограниченной областью действия, это просто другое место. Ваше решение кажется подходящим, если вы знаете, где передать свою службу области действия пользователю (конечно, сразу после аутентификации). Весь последующий код может использовать его нормально. - person King King   schedule 04.03.2021