ASP身份:绑定会话以请求URL(子域)

时间:2016-07-01 08:27:31

标签: asp.net asp.net-mvc asp.net-identity

我不认为这个问题的标题是特别准确的,但这是我最好的标题。

在没有总结的情况下,我在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);

1 个答案:

答案 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