首页 > 解决方案 > 在 DbContext 中使用 Azure B2C 在 ASP.NET Core 上实现多租户

问题描述

我有一个 .NET Core 3.1 Web API 应用程序,它根据用户来自哪个组织连接到不同的数据库。该组织在 Azure AD B2C 中的用户帐户中存储为字符串值,在执行请求时,我需要识别该用户的组织并根据其组织选择正确的连接字符串。

但是,我无法在我的 DbContext 中获取用户的“userId”。我尝试了两种不同的实现,但都没有工作。

  1. 在我的 Startup.cs 文件的“ConfigureServices”方法中,我指定了以下内容:

         ...
         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 上,我尝试从声明中提取 userId:

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/

标签: c#azureasp.net-coreazure-ad-b2cmulti-tenant

解决方案


推荐阅读