0

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

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

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

4

2 回答 2

4

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

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

于 2013-01-13T13:58:48.120 回答
1

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

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

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

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

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

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

于 2015-11-26T04:47:33.233 回答