我不认为这个问题的标题是特别准确的,但这是我最好的标题。
在没有总结的情况下,我在Microsoft Azure上托管了一个MVC应用程序。该应用程序是为多个机构(每个连接到一个单独的数据库)而构建的,但登录模块(Asp Identity)位于中央数据库中(用户通过其机构代码识别)。因此,在部署期间,会创建一个子域(仍然指向azure上的应用程序)。
我的问题是,该应用不考虑请求网址,会话是跨域维护的。这是一个严重的问题,因为我缓存了用户数据(通过会话)。因此,如果用户登录" domain1.myapp.com " ,然后打开另一个标签,登录" domain2.myapp.com " ,为用户登录的所有数据缓存为" domain1 "将用于登录" domain2 "的用户。该应用程序无需为" domain2 "中的用户获取数据。因为该数据值的密钥已存在于会话缓存中。
好的,我希望能够理解这个问题。我如何通过这个。
想法?实施?
编辑1
我通过
将数据插入缓存HttpRuntime.Cache.Insert("KEY", "VALUE", null, DateTime.Now.AddMinutes(30),Cache.NoSlidingExpiration);
答案 0 :(得分:3)
当您按用户和每个域进行缓存时,您的缓存策略需要更改。最简单的方法是将域和用户名添加到缓存键,这将使每个缓存保持在单独的每个用户和每个域桶中。确保在值之间放置分隔符以确保密钥的唯一性。
var domain = HttpContext.Request.Url.DnsSafeHost;
var user = HttpContext.User.Identity.Name;
var key = "__" + domain + "_" + user + "_" + "KEY";
HttpRuntime.Cache.Insert(key, "VALUE", null, DateTime.Now.AddMinutes(30),Cache.NoSlidingExpiration);
请注意,如果您使用
HttpContext.Session
,它会自动将不同的域信息放入单独的存储桶中,因为它基于cookie(默认情况下是特定于域的)。但是,HttpContext.Session
comes with its own set of problems。