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

时间:2011-03-01 23:11:55

标签: asp.net-mvc session authentication c#-4.0

我们在业余时间使用最新的mvc3和Entity Framework .net库构建了一个小型应用程序,并进行了部署。管理层喜欢它,他们希望将它集成到繁重的.net 3.5 Web表单应用程序中。

我需要以某种方式在两个应用程序中使用相同的身份验证会话。我使用相同的数据库和应用程序使用.net成员资格和配置文件提供程序进行身份验证。这样可以正常工作,但即使用户已经登录主应用程序,用户也必须单独登录MVC应用程序。我愿意接受任何建议:enabling state session at a different levelshared cookies

绕过此登录要求的最佳方法是什么?是否应将mvc应用程序集成到webforms中或将其保留为独立应用程序?影响决策的主要问题是完成集成所需的时间,以及以后维护应用程序的时间。

4 个答案:

答案 0 :(得分:7)

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

其次,这是MSDN的一个例子:

http://msdn.microsoft.com/en-us/library/eb0zx8fc.aspx

该页面的小片段:

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

P.S。

StriplingWarrior关于合并两个应用程序的建议虽然不是真正需要但可能对将来的集成非常有用。无论如何,你最终可能会这样做。

答案 1 :(得分:2)

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

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

您还必须确保两个应用程序共享相同的machine keys,因为app1发出的身份验证Cookie需要由app2使用相同的密钥进行解密。

答案 2 :(得分:0)

您可能需要考虑直接将此应用程序直接集成到Web窗体应用程序中。这两者可以在同一个应用程序中共存。

答案 3 :(得分:0)

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