#c# #azure #asp.net-core #azure-ad-b2c #multi-tenant
Вопрос:
У меня есть приложение веб-API .NET Core 3.1, которое подключается к различным базам данных в зависимости от того, из какой организации пользователь. Организация хранится в виде строкового значения в их учетной записи пользователя в Azure AD B2C, и при выполнении запроса мне нужно идентифицировать организацию этого пользователя и выбрать правильную строку подключения на основе их организации.
Однако у меня возникли проблемы с получением идентификатора пользователя в моем DbContext. Я пробовал две разные реализации, но ни одна из них не работает.
- В методе «ConfigureServices» в моем файле Startup.cs я указал следующее:
... services.AddHttpContextAccessor(); services.AddTransient<IUserRepository, UserRepository>();
- Затем я объявил интерфейс с его сервисом:
public interface IUserRepository { public void LogCurrentUser(); } public class UserRepository : IUserRepository { private readonly IHttpContextAccessor _httpContextAccessor; public UserRepository(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } public void LogCurrentUser() { var username = _httpContextAccessor.HttpContext.User.Identity.Name; } }
3)И, наконец, в моем DbContext я пытаюсь извлечь идентификатор пользователя из утверждения:
public class ApplicationDbContext : DbContext
{
private readonly ApplicationTenantClient _tenant;
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options,
ITenantService tenantProvider,
IUserRepository userRepository,
IHttpContextAccessor httpContextAccessor) : base(options)
{
// Attempt (1)
userRepository.LogCurrentUser();
// Attempt (2)
var userAccessor = httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier);
if(userAccessor != null)
{
var userId = userAccessor.Value;
}
_tenant = tenantProvider.GetTenant(); // <- ideally send userId here for lookup on AD Graph
}
...
После аутентификации пользователя, а затем попытки вызвать конечную точку, утверждение остается пустым:
Это … очень запутанно, любая помощь будет признательна.
Статьи, которым я пытался следовать
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-context?view=aspnetcore-5.0
https://www.koskila.net/how-to-get-current-user-in-asp-net-core/
Комментарии:
1. Пожалуйста, опубликуйте код в виде текста
2. Извините за это, я сделал это сейчас
3. Где вы устанавливаете требования в файле cookie или JWT?
4. JWT, поскольку он использует Azure AD B2C