【问题标题】:Multi Tenant - User relations - Some real life examples? (asp.net / websecurity)多租户 - 用户关系 - 一些现实生活中的例子? (asp.net/网络安全)
【发布时间】:2012-12-28 10:00:14
【问题描述】:

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

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

验证

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

确定租户

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

注册新客户

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

要求

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

我的问题

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

我的热门话题:

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

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

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

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

非常感谢。

【问题讨论】:

    标签: asp.net asp.net-mvc cloud multi-tenant


    【解决方案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 等。无论您在模型中拥有什么)提取数据

    【讨论】:

    • 嘿托姆,谢谢你的回答。所以你确实使用网络安全框架来允许用户登录?您似乎使用了 user.identity.name。并且您使用另一个通过 name 属性链接到 MembershipUsers 的用户表?
    • 不完全是。我使用带有表单身份验证的自定义 MembershipProvider 来做到这一点。但你可以按你说的做。
    • 谢谢。也许我应该少问多写。有太多的选择,恐怕我开始押错马了。感谢您的时间和回答!
    • 你会明白的。给猫剥皮的方法有很多种。你必须弄清楚什么最适合你。这是一个程序,如果它不能按您想要的方式工作,您可以随时返回并更改它(使用版本控制:))。阅读 Scott Hanselman、Steve Sanderson、Phil Haack 的博客,这些人总是有一些聪明的东西可以分享。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 2019-07-20
    • 2016-04-02
    • 2014-04-08
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    相关资源
    最近更新 更多