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

时间:2015-07-14 14:32:26

标签: c# asp.net-mvc wcf session

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

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

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

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

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

感谢您提供任何信息

1 个答案:

答案 0 :(得分:2)

如果您的WCF层位于同一个应用程序池中,您可以检查ASPXAuth cookie(可配置的Forms Auth cookie名称),并且您可以使用FormsAuthentication类/命名空间中的方法来解码cookie以使用户进入你的WCF层。

如果您将表单auth cookie配置为域cookie,那么您可以将WCF层托管在其他应用程序池/ iis站点中,只要它与您的主站点位于同一个域中即可。两个站点都将收到cookie。

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

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

如果您将网站配置为在网址模式下使用Forms Auth,则可以在没有Cookie的情况下进行身份验证,但是您必须在每个网址中传递FormsAuth票证...

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