【问题标题】:Store tenant id in the asp.net session?在 asp.net 会话中存储租户 ID?
【发布时间】:2015-11-26 12:47:33
【问题描述】:

我正在构建一个多租户 MVC4 Web 应用程序。我根据 url 别名 (customername.webapp.net) 区分租户。我有一个存储客户 ID 的数据库,我可以使用客户名称进行查找。

显然,在该客户的用户使用我的 web 应用程序的整个会话期间,我需要此客户标识。

在会话中存储这个唯一标识符是否可以接受?或者这种“会话数据”有更好的设计选择吗?

【问题讨论】:

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


    【解决方案1】:

    我宁愿将此信息存储在表单身份验证 cookie 的 UserData 部分中(如果您使用的是 Forms Authenticatoin),或者如果您使用的是claims based authentication,则只需将其添加为声明。当用户登录时,您将从当前请求中提取租户名称,查询您的数据库以获取租户 ID,然后将该 ID 持久化。如果您将 id 存储在 Forms Authentication cookie 的 UserData 部分中,您可以编写一个自定义的[Authorize] 属性,该属性将读取 FormsAuthenticationTicket,对其进行解密,从 UserData 部分获取租户 id,然后构建一个自定义主体。这样,您就可以在应用程序的任何地方使用它。如果您使用基于声明的身份验证,您只需将其添加为新声明即可。

    我根本不会在我的应用程序中使用 Session。

    【讨论】:

    • 嗨达林,感谢您的回答。我还没有使用它们中的任何一个。如果你是我,并且你对这两个建议的解决方案没有经验,你会选择哪一个?如果以后在安全性方面给我带来麻烦,我不想走简单的路。你能告诉我两者中哪一个是“最好的”吗?
    • 如果您不使用这两种身份验证技术中的任何一种,您将如何跟踪经过身份验证的用户?您使用的是 Windows 集成身份验证还是一些自定义构建的方案?
    • 使用 mvc4 中提供的默认 WebSecurity 框架(使用 WebMatrix.WebData;)
    • 所以您正在使用表单身份验证。 WebSecurity 允许您检索有关用户的成员资格和角色信息。它不是一种身份验证方案。在这种情况下,将租户 ID 存储在表单身份验证 cookie 的用户数据部分中似乎是一种有效的方法。
    • 哈哈,我认为(或希望)我会使用我不知道的东西:)。好吧,我会开始阅读更多。感谢您的帮助!
    【解决方案2】:

    请不要被答案误导。使用 cookie 很危险。

    在这种情况下,会话将是有效选项,而不是 cookie。如果您将tenantId 存储在cookie 中,并且您的应用程序根据您的cookie 建立数据库连接,那么在您以用户身份登录后,您可以篡改和更改cookie,现在您的应用程序将连接到另一个数据库,从而损害安全性。即使您的 cookie 是加密的,它也不是 100% 可靠的。

    在这种情况下,会话将是可靠的服务器信息,用于跟踪应连接到哪个租户数据库。尽管 session 与 cookie 相比可能会降低性能,但在这种情况下,您没有其他好的选择。您正在设计一个多租户应用程序,而这只是您必须牺牲的东西。

    是的,如果您真的愿意,您仍然可以使用 cookie。您只需要不断检查用户是否以某种方式连接到正确的数据库,对我来说,这比使用会话更会降低性能。

    不要因为很多人滥用或讨厌它而讨厌会话。你只需要以正确的方式使用它。

    底线是,如果您出于安全目的使用任何信息,请不要使用 cookie。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多