与websecurity(来自microsoft的webmatrix框架)相结合,我在解决多租户概念方面遇到了麻烦。我正在建立一个多租户网站:
身份验证
我可以允许用户注册&使用WebSecurity方法登录。我可以通过User.Identy.IsAuthenticated
验证用户是否已登录/已通过身份验证。
确定租户
我通过网址([companyname].domain.com
)确定租户。
注册新客户
新客户可以通过我的应用程序中的注册表单创建租户。如果用户注册(网址中没有公司名称),他将不得不提供一些公司输入的帐户输入。然后,他将创建一个符合companyname.domain.com的新别名。 因此,长话短说,租户总是与一个或多个用户(1-N)耦合。
要求
我需要保证来自Tenant'abc'的用户永远无法登录租户'xyz'。 (因此我也不太喜欢WebSecurity框架,因为它似乎是我所有租户的共享数据库(或者我错了?))。
我的问题
您是否可以分享一些有关如何在现实世界多租户应用程序中处理“租户”和“经过身份验证的用户”检查的见解?
热门话题:
如果你能分享一些我可以阅读所有这些问题的文件,我会得到很大的帮助。我强烈希望看到一些关于多租户的详细文档,这些文档深入到实际设计中(甚至可能是代码示例)。
我已经阅读了大部分“一般文件”/“商业演示文稿”:
如果需要,我会重新编写/添加代码/做任何需要的帮助。
非常感谢提前。
答案 0 :(得分:1)
您可以获得的每个解决方案都取决于您的应用程序的作用以及它如何处理数据,如果您使用存储库模式,如果您使用IoC等。您可以考虑通过将userid传递给存储库类来进行即时存储。过滤每次应用程序需要的数据,你可以在你的控制器中做到这一点 - 这种方法经常使用(即使在VS SampleProjects中 - 比如“SinglePage Application”你可能想要下载一些开源项目,看看它是如何在那里完成的。
我在我的一些项目中做了什么,其中没有什么“真正的花哨”是必需的,我不期望巨大的负荷是这样的: - 我设置了其他控制器需要实现的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对象。您可以对公司对象执行相同操作。所以我假设您会像我一样查询Employees并检索Company引用并将其传递给BaseController上的公共属性。它可能不是最好的解决方案,但只要您记得通过公司对象导航属性(例如员工,门票,请求等等)从模型中提取数据,它就相当安全。