Asp.net mvc 3 具有MVC3和自定义成员资格提供程序的多租户

Asp.net mvc 3 具有MVC3和自定义成员资格提供程序的多租户,asp.net-mvc-3,multi-tenant,custom-membershipprovider,Asp.net Mvc 3,Multi Tenant,Custom Membershipprovider,我有一个关于多租户(使用MVC3、EF)和自定义SQL成员资格提供程序的问题 我创建了自定义用户和角色成员类,因为我必须在我的应用程序表中包括userId以及其他基于用户的属性。我现在将其转换为多租户应用程序。我们将采用共享数据库、共享应用程序模型。我们有一个主租户表,存储租户详细信息(包括URL),每个表中都包含租户id。现在我们正在对应用程序本身进行更改 假设租户将使用如下URL登录:tenantur.mybaseURL.com 我将根据此算法更改自定义用户验证方法: - User goes

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

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

假设租户将使用如下URL登录:tenantur.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; }

    }
}
租户ID将在上述上下文中的帐户控制器登录中设置

以上是一个好方法还是有更好的方法?有人看到我应该注意的问题吗

我在这里看到了一个存储在AppSettings中的tenantId示例。这是更好的方法吗


谢谢你

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

您是否在询问如何为剩余的登录操作获取租户id?或者您正在询问如何为登录用户发出的后续请求获取tenantId。我要求你在HttpContext中设置tenantId。对于每个后续请求的项目,你必须从某处获取它,对吗?嗨,Amith,我在问上面的算法是否正确,因为这是我的第一个多租户应用程序。我将根据URl从数据库中获取租户ID,并存储在请求对象中(如果是有效用户)。您是否有可能将解决方案发布到您所做的事情中?您好saravanan-您是否使用EF导航属性进行过多租户操作?我有点麻烦,如果你有时间检查一下,我会非常感激:很抱歉延迟回复。您可以创建IObjectSet的扩展,然后执行基于租户的筛选器,然后返回IQueryable。在这种情况下,您将拨打电话。Include(“entity”).FilterTenant()这将是正确且简单的使用方法。。。