Многодетность на ASP.NET Ядро в DbContext с Azure B2C

#c# #azure #asp.net-core #azure-ad-b2c #multi-tenant

Вопрос:

У меня есть приложение веб-API .NET Core 3.1, которое подключается к различным базам данных в зависимости от того, из какой организации пользователь. Организация хранится в виде строкового значения в их учетной записи пользователя в Azure AD B2C, и при выполнении запроса мне нужно идентифицировать организацию этого пользователя и выбрать правильную строку подключения на основе их организации.

Однако у меня возникли проблемы с получением идентификатора пользователя в моем DbContext. Я пробовал две разные реализации, но ни одна из них не работает.

  1. В методе «ConfigureServices» в моем файле Startup.cs я указал следующее:
          ...
         services.AddHttpContextAccessor();
         services.AddTransient<IUserRepository, UserRepository>();
     
  2. Затем я объявил интерфейс с его сервисом:
      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