我正在构建一个多租户MVC4 Web应用程序。我基于url别名(customername.webapp.net)区分租户。我有一个数据库存储客户ID,我可以使用客户名查找。
显然,在整个会话期间,我需要此客户识别该客户的用户正在使用我的webapp。
在会话中存储此唯一标识符是否可以接受?或者这种“会话数据”有更好的设计选择吗?
答案 0 :(得分:4)
我宁愿将此信息存储在表单身份验证cookie的UserData部分中(如果您使用的是Forms Authenticatoin),或者只是在使用claims based authentication
时将其添加为声明。当用户登录时,您将从当前请求中提取租户名称,查询您的数据库以获取租户ID,然后保留此ID。如果将id存储在Forms Authentication cookie的UserData部分中,您可以编写一个自定义[Authorize]
属性,该属性将读取FormsAuthenticationTicket,解密它,从UserData部分获取租户ID,然后构建自定义主体。这样您就可以在应用程序的任何位置使用它。如果您使用基于声明的身份验证,则只需将其添加为新声明。
我不会在我的应用程序中使用Session。
答案 1 :(得分:0)
请不要被答案误导。使用cookie是危险的。
本案例中的会话将是有效选项,而不是cookie。如果您将tenantId存储在cookie中,并且您的应用程序根据您的cookie建立数据库连接,那么在您以用户身份登录后,您可以篡改并更改cookie,现在您的应用程序将连接到另一个数据库,从而危及安全性。即使您的cookie已加密,也不是100%可靠。
在这种情况下,会话将是可靠的服务器信息,用于跟踪应连接到哪个租户数据库。虽然与cookie相比,会话可能会降低性能,但在这种情况下,您没有其他好的选择。您正在设计一个多租户应用程序,这只是您必须牺牲的东西。
是的,如果你真的想要,你仍然可以使用cookie。你只需要继续检查用户是否以某种方式连接到正确的数据库,对我而言,这比使用会话更能降低性能。
不要因为很多人滥用或讨厌而讨厌会话。你只需要以正确的方式使用它。
底线是,如果出于安全目的使用任何信息,请不要使用cookie。