我不认为问题的标题是特别准确的,但这是我最好的标题。
不总结,我有一个MVC应用程序托管在微软Azure。该应用程序是为多个机构构建的(每个机构连接到一个单独的数据库),但登录模块(Asp Identity)在一个中央数据库中(用户通过其机构代码识别)。因此,在部署期间,创建一个子域(仍然指向azure上的应用程序)。
我的问题是,应用程序没有考虑请求Url,会话是跨域维护的。这是一个严重的问题,因为它缓存用户数据(按会话)。因此,如果用户登录"domain1.myapp.com",然后打开另一个选项卡,登录到"domain2.myapp.com",为登录为"domain1"的用户缓存的所有数据将用于登录为"domain2"的用户。应用程序不需要在"domain2"中为用户获取数据,因为该数据值的键已经存在于会话缓存中。
好的,我希望你能理解这个问题。
想法?实现?
编辑1
我插入数据到缓存,
HttpRuntime.Cache.Insert("KEY", "VALUE", null, DateTime.Now.AddMinutes(30),Cache.NoSlidingExpiration);
当对每个用户和每个域进行缓存时,需要更改缓存策略。最简单的方法是将域和用户名添加到缓存键中,这将使每个缓存保持在每个用户和每个域桶中。请确保在值之间放置分隔符,以确保键的唯一性。
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
也有它自己的一组问题。