我们有一个在 Azure 上运行的 ASP.NET MVC Web 角色。整个站点需要 https,使用 [RequireHttps] 属性。作为网站的一部分,我们与信用卡支付网关集成。
用户可以登录,无论他们在网站上停留多长时间或访问哪个页面,一切都很好,直到他们进入付款步骤。付款涉及以下内容:
- 用户单击“购买”并将他们的购物车信息发布到控制器操作一。
- 控制器动作一。
- 从服务器向支付处理器的 API 发送一个 http 请求,以获取唯一的表单操作 URL。
- 向用户展示一个收集付款信息的表单。
- 然后使用步骤 2 中的表单操作 URL,将该表单直接从浏览器发布到支付处理器。
- 支付处理器使用令牌将浏览器重定向到控制器操作二。
- 控制器动作二
- 我们使用令牌将最终请求从服务器发送到完成交易的支付处理器。
- 我们向用户展示一个成功页面。
在付款过程中的某个地方,用户的会话被丢弃。我们没有明确将任何人登出或做任何其他看起来会导致这种情况的事情。
其他有用信息:
- 我们只有一个实例在运行,所以我们使用的是 InProc 会话而不是 AppFabric。
- 本地测试服务器很好。一切都在可能的情况下进行了相同的设置。
- Azure 模拟器中的一切都很好(据我可以测试。完整的测试需要支付网关访问模拟器,这是不可能的)。
- 身份验证 cookie 在浏览器中仍然完好无损。
- 一切都在会话超时窗口内发生。
- 如果我关闭 https 并且一切都通过 http 运行,那么一切都很好。
什么可能导致用户的会话被丢弃?这一定是结合了 Azure、https 和远程 http 请求的结果,因为如果我将其中一个排除在等式之外,那么一切正常。