【问题标题】:Multi-tenancy with MVC3 and Custom Membership Provider使用 MVC3 和自定义成员资格提供程序的多租户
【发布时间】:2013-04-29 02:23:03
【问题描述】:

我有一个关于多租户(使用 MVC3、EF)和自定义 SQL 成员资格提供程序的问题。

我创建了自定义用户和角色成员资格类,因为我必须在我的应用程序表中包含 userId 以及其他基于用户的属性。我现在将其转换为多租户应用程序。我们正在寻找一个共享数据库、共享应用程序模型。我们有一个存储租户详细信息(包括 URL)的主租户表,并且 Tenant_id 已包含在每个表中。现在我们正在对应用程序本身进行更改。

假设租户将使用如下 URL 登录:tenantUrl.mybaseURL.com。

我将根据此算法更改我的自定义用户验证方法:

- User goes to URL to login
- The Account controller logon method calls the Custom validate method passing in user/pwd and the tenantId (which has been looked up from the db using the URL).
- The custom validate method checks if the user/password/tenantId combination are valid. 
- If valid, we set the tenant Id in a HttpRequest Object and login the user
- For each db access, we lookup the Request object for the tenandId and use that as a filter. 

编辑:这是我的 TenantContext 类,我将在其中设置/获取tenantId

public class TenantContext
{
    public static int TenantId
    {
        set
        {

            if (!HttpContext.Current.Items.Contains("tenant-code"))
                HttpContext.Current.Items.Add("tenant-code", value);

            HttpContext.Current.Items["tenant-code"] = value;
        }

        get {return HttpContext.Current.Items.Contains("tenant-code") ? Convert.ToInt32(HttpContext.Current.Items["tenant-code"]) : -1; }

    }
}

tenantId 将在上述 Context 中的 Account Controller Login 中设置。

以上是实现此目的的好方法还是有更好的方法?有人看到我应该注意的任何问题吗?

我在Handling data access in multi tenant site 看到了一个将tenantId 存储在AppSettings 中的示例。这是更好的方法吗?

谢谢

【问题讨论】:

  • 您是否在询问如何为登录操作的其余部分获取tenantId?或者您是否在询问如何为登录用户发出的后续请求获取tenantId。我问是因为你要在每个后续请求的 HttpContext.Items 中设置tenantId,你必须从某个地方获取它,对吧?
  • 嗨,Amith,我在问上面的算法是否正确,因为这是我的第一个多租户应用程序。如果用户有效,我将根据 URl 从数据库中获取租户 ID 并存储在请求对象中。
  • 你有没有机会发布你所做的解决方案?

标签: asp.net-mvc-3 multi-tenant custom-membershipprovider


【解决方案1】:

你的算法很完美,事实上我一直在研究这种实现。我有一个建议,你可以使用自定义对象来维护不同层的用户身份。这将包含用户 ID、租户 ID 等。因为在 WCF 服务的情况下以及在属于租户并代表另一个租户操作的用户的上下文中,此 HttpContext 不会帮助您。因此,拥有一个标识用户的 UserIdentity 对象将是一个更好的选择。此外,请务必将租户 ID 发送到数据访问层,并且不要从请求中推断租户 ID,因为它并非在所有环境中都可用。

【讨论】:

  • 嗨 saravanan - 你曾经使用 EF Navigation 属性进行过多租户吗?我遇到了一些麻烦,如果您有时间检查一下,我将不胜感激:stackoverflow.com/questions/19826316/…
  • 抱歉延迟回复。您可以创建 IObjectSet 的扩展,然后执行基于租户的过滤器,然后返回 IQueryable。在这种情况下,你会打电话。 Include("entity").FilterTenant() 这将是正确且简单的使用方式...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多