Asp.net mvc 如何在web表单和MVC2应用程序之间共享基于.net(C#)的身份验证会话?

Asp.net mvc 如何在web表单和MVC2应用程序之间共享基于.net(C#)的身份验证会话?,asp.net-mvc,session,authentication,c#-4.0,Asp.net Mvc,Session,Authentication,C# 4.0,我们在业余时间使用最新的mvc3和实体框架.net库构建了一个小应用程序,并对其进行了部署。管理层喜欢它,他们希望将它集成到一个传统的.NET3.5WebForms应用程序中 我需要在两个应用程序之间使用相同的身份验证会话。我使用相同的数据库和应用程序使用.net成员资格和配置文件提供程序进行身份验证。这很好,但是用户必须单独登录MVC应用程序,即使他们已经登录了主应用程序。我愿意接受任何建议:,或,等等 绕过此登录要求的最佳方法是什么?我是应该将mvc应用程序集成到webforms中,还是将其

我们在业余时间使用最新的mvc3和实体框架.net库构建了一个小应用程序,并对其进行了部署。管理层喜欢它,他们希望将它集成到一个传统的.NET3.5WebForms应用程序中

我需要在两个应用程序之间使用相同的身份验证会话。我使用相同的数据库和应用程序使用.net成员资格和配置文件提供程序进行身份验证。这很好,但是用户必须单独登录MVC应用程序,即使他们已经登录了主应用程序。我愿意接受任何建议:,或,等等


绕过此登录要求的最佳方法是什么?我是应该将mvc应用程序集成到webforms中,还是将其作为一个独立的应用程序?影响决策的主要关注点是完全集成的时间,以及应用程序的后期维护。

< P>您可能想简单地将此应用程序直接集成到Web窗体应用程序中。这两者可以在同一个应用程序中共存。

表单身份验证使用cookies跟踪用户。Cookie只能在同一域之间共享。例如,如果您有
app1.foo.com
app2.foo.com
,只需将这两个应用程序配置为共享同一个域cookie即可。例如,两个web.config应共享相同的表单身份验证配置:

<authentication mode="Forms">
  <forms 
      loginUrl="~/Account/LogOn" 
      timeout="2880" 
      domain="foo.com" 
  />
</authentication>

因为由
app1
发出的身份验证cookie需要由
app2
用相同的密钥解密。

首先,一个应用程序是ASP.NET MVC这一事实在这里没有区别:)

其次,下面是一个MSDN的示例:

该页面中的小片段:

<configuration>
  <system.web>
    <authentication mode="Forms" >
      <!-- The name, protection, and path attributes must match 
           exactly in each Web.config file. -->
      <forms loginUrl="login.aspx"
        name=".ASPXFORMSAUTH" 
        protection="All"  
        path="/" 
        domain="contoso.com" 
        timeout="30" />
    </authentication>

    <!-- Validation and decryption keys must exactly match and cannot
         be set to "AutoGenerate". The validation and decryption
         algorithms must also be the same. -->
    <machineKey
      validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" 
      decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" 
      validation="SHA1" />
  </system.web>
</configuration>

附言


StriplingWarrior关于合并这两个应用程序的建议虽然不是必需的,但对于将来的集成可能非常有用。您以后可能仍然会这样做。

将会话状态存储在数据库中。将会话密钥存储在每个会话的cookie中。在两个应用程序生命周期的AcquireSessionState事件中,从cookie中获取会话id,从数据库加载会话数据,并更新您的
HttpContext.User
。然后,您将在两个应用程序中拥有相同的身份验证数据

您的域属性实际上应为
.foo.com
-您不允许只设置一个句点的cookie。+1用于同时提及机器密钥-即使它们位于同一台机器上,如果应用程序池不同,如果不设置,也会出现问题。您的域属性实际上应该是
.contoso.com
-您不允许只使用一个句点设置Cookie。您可以将
会话状态
模式设置为
SqlServer
StateServer
,框架将为您解决所有这些问题(将会话序列化到数据库,将会话密钥存储在cookie中等):这听起来不准确。如果我回忆正确,会话将与应用程序ID关联存储。由于他运行两个独立的应用程序,因此这不会解析相同的数据。