如何在 MVC 项目和 WCF 项目之间共享会话?

How to share session between a MVC project and a WCF project?

我有一个 angular-WebAPI-MVC-WCF 解决方案。

我想在 MVC 和 WCF 项目之间共享用户会话。这可能吗?

另外,我想分享一下身份验证机制,我的意思是,我只希望使用FormAuthentication在MVC项目上对用户进行一次身份验证,并在不涉及任何其他技术的情况下让WCF知道用户何时进行了身份验证。

我有另一个解决方案,其中 MVC 和 WCF 应用驻留在同一个项目 (dll) 中,并且在该上下文中我可以共享身份验证和会话数据。
因此,为了共享会话,我应该将 svc 文件从 WCF 移到 MVC 项目中吗?这是唯一的方法吗?

所有项目共享同一个数据库,但我想解决这个问题而不必在数据库级别存储会话数据。

感谢您提供任何信息

如果您的 WCF 层位于同一个应用程序池中,您可以检查 ASPXAuth cookie(可配置的 Forms Auth cookie 名称),并且可以使用 FormsAuthentication class/namespace 中的方法将 cookie 解码为在您的 WCF 层中获取用户。

如果您将表单身份验证 cookie 配置为域 cookie,那么您可以在不同的应用 pool/iis 站点中托管您的 WCF 层,只要它与您的主站点位于同一域中。两个站点都会收到 cookie。

该 cookie 驱动表单身份验证。如果 FormsAuthenticationModule 在请求 cookie 集合中看到 cookie,它会从 cookie 中检索用户(对其进行解密)并创建经过身份验证的会话。

您还可以选择通过在 WCF 层中创建登录方法并让它在 WCF 站点中创建 Forms Cookie 来自行创建 cookie。但是,退出主站点不会退出 Web 服务,因此当用户退出主站点时,您必须在 Web 服务层上调用注销,反之亦然。

如果您将站点配置为在 url 模式下使用 Forms Auth,您可以在没有 cookie 的情况下进行身份验证,但是您必须在每个 url...

关于共享会话数据,您可以将 ASP.Net 会话状态配置为基于数据库而不是基于进程。这样做 ASP.Net 将为您将会话数据放入数据库中,您不需要自己做。 https://support.microsoft.com/en-us/kb/317604#bookmark-3