1

我很难将多租户的概念与网络安全(来自微软的 webmatrix 框架)结合起来。我正在建立一个多租户网站:

  • mvc4
  • 实体框架6
  • 网络安全(来自 webmatrix)

认证

我可以允许用户使用 WebSecurity 方法注册和登录。我可以验证用户是否已登录/是否通过User.Identy.IsAuthenticated.

确定租户

我通过 url ( [companyname].domain.com) 确定租户。

注册新客户

新客户可以通过我的应用程序中的注册表单创建租户。如果用户注册(网址中没有公司名称),他将必须提供一些帐户输入作为一些公司输入。然后,他将创建一个新别名,即符合 companyname.domain.com。因此,长话短说,租户总是与 1 个或多个用户 (1-N) 耦合。

要求

我需要保证租户“abc”的用户永远无法登录租户“xyz”。(因此我也不太喜欢 WebSecurity 框架,因为它似乎是我所有租户的共享数据库(或者我错了吗?))。

我的问题

你们能否分享一些关于如何处理现实世界多租户应用程序中“租户”和“经过身份验证的用户”检查的见解?

我的热门话题:

  • 您是验证一次租户+经过身份验证的用户,还是在每个控制器的每个操作中验证一次?
  • 依赖默认的网络安全类是否安全,或者我会更好地设计自己的用户表,还是客户 MembershipProviders 是更好的选择?
  • 我应该使用 cookie 还是这是一个非常糟糕的选择。

如果你能分享一些我可以阅读所有关于这些问题的文档,我会非常有帮助。我强烈希望看到更多关于多租户的详细文档,这些文档深入到实际设计中(甚至可能是代码示例)。

我已经阅读了大部分“一般文档”/“商业演示”:

如果需要,我会改写/添加代码/做任何需要帮助的事情。

提前谢谢了。

4

1 回答 1

1

您可以在此处获得的每个解决方案都取决于您的应用程序的功能以及它如何处理数据,如果您使用存储库模式,是否使用 IoC 等。您可以考虑通过将用户 ID 传递给存储库类并在每次应用程序时进行过滤来实例化存储库需要数据,你可以在你的控制器中做到这一点——这种方法经常使用(即使在 VS SampleProjects 中——比如“SinglePage 应用程序”,你可能想下载一些开源项目并看看它是如何完成的。

我在一些不需要“真正花哨”并且我不希望有巨大负载的项目中所做的是: - 我设置了每个其他控制器都需要实现的 BaseController - 在我做的 BaseController 的 onActionExecuting 事件中

public Employee CurrentEmployee { get; set; }

protected override void OnActionExecuting(ActionExecutingContext ctx)
{
    base.OnActionExecuting(ctx);
    string authenticatedUser = User.Identity.Name;
    CurrentEmployee = mortenDb.Employees.FirstOrDefault(e => e.Account.Login == authenticatedUser );
}

所以在所有其他控制器中,我可以引用属于当前登录用户的 Employee 对象。您可以对您的 Company 对象执行相同的操作。所以我假设你会像我一样查询员工并检索公司引用并将其传递给 BaseController 上的公共属性。这可能不是最好的解决方案,但只要您记得通过 Company 对象导航属性(例如,Employees、Tickets、Requests 等您在 Model 中拥有的任何内容)提取数据,它就相当安全

于 2013-01-14T13:44:37.333 回答