2011-03-01 75 views
8

我们有一个小型应用程序,我们在业余时间使用当时可用的最新mvc3和Entity Framework .net库进行构建,并部署它。管理层喜欢它,他们希望将它集成到一个沉重的遗留.net 3.5 Web窗体应用程序中。如何在Web窗体和MVC2应用程序之间共享基于.NET(C#)的身份验证会话?

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

什么是绕过此登录需求的最佳方式,以及是否我应该MVC应用集成到Web表单或保持它作为一个独立的应用程序?我影响决策的主要问题是完成整合以及后续维护应用程序所需的时间。

回答

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的虽然不是真正需要的,但可能是未来的整合是非常有用的合并这两个应用程序的建议。无论如何,你以后可能会这样做。

+2

+1也提到了机器密钥 - 即使它们在同一台机器上,如果应用程序池不同,如果没有设置,也会出现问题。您的域名属性实际上应该是'.contoso.com' - 您不会被允许设置只有一个时间段的cookie。 – 2011-03-02 00:36:49

0

你可能要考虑这个简单的应用程序直接集成到您的Web窗体应用程序。这两者可以共存于同一个应用程序中。

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用相同的密钥进行解密。

+0

你的域属性其实应该读作.foo.com' - 你将不会被允许只用一个周期设置cookies。 – 2011-03-02 00:35:57

+0

@Zhaph - Ben Duguid,没有必要,这将工作。 – 2011-03-02 06:50:33

0

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

+0

您可以将'sessionState'模式设置为'SqlServer'或'StateServer',并且框架将为您处理所有这些事情(将会话序列化到数据库,将会话密钥存储在cookie中等):http ://msdn.microsoft.com/en-us/library/ms178586.aspx – 2011-03-02 00:41:05

+0

这听起来不正确。如果我没有记错,会话将与应用程序ID关联存储。由于他正在运行两个单独的应用程序,因此这不会解析相同的数据。 – smartcaveman 2011-03-02 16:51:16

相关问题