ASP.NET 2.0站点中的ASP.NET 4.0应用程序是否可以使用相同的Forms Authentication

本文关键字:NET ASP Forms Authentication 可以使 站点 应用程序 是否 | 更新日期: 2023-09-27 18:20:21

请参阅问题底部的更新

我有一个ASP.NET 2.0 web应用程序(比如https://mysite.somedomain.com/),它使用表单身份验证。我希望在此站点中集成一个基于https://mysite.somedomain.com/NewApp/的ASP.NET 4.0 web应用程序。Forms Auth正在处理外部应用程序,但内部应用程序正在拒绝cookie。

外部(ASP.NET 2.0)web应用程序上的web.config包含:

<httpCookies requireSSL="true"/>
<authentication mode="Forms">
    <forms name="MySiteWebAuth" loginUrl="/Login.aspx" protection="All" 
           path="/" timeout="90" requireSSL="true" slidingExpiration="true"/>  
</authentication>
<machineKey (same machine key is in both configs)  
    validation="SHA1"
    decryption="AES"/>
<authorization>
  <deny users="?"/>
  <allow users="*" />
</authorization>

内部(ASP.NET 4.0)web应用程序上的web.config包含:

<authentication mode="Forms">
    <forms name="MySiteWebAuth" loginUrl="/Login.aspx" protection="All" 
           path="/" timeout="90" requireSSL="true" slidingExpiration="true"
           ticketCompatibilityMode="Framework20"/>  
</authentication>
<machineKey (same machine key is in both configs)  
    validation="SHA1"
    decryption="AES"/>

这是Login.aspx.cs中用于在成功身份验证时设置cookie的代码:

FormsAuthenticationTicket ticket = 
    new FormsAuthenticationTicket(
        1, 
        ApplicationContext.User.Identity.Name, 
        DateTime.Now, 
        DateTime.Now.AddMinutes(90), 
        false, 
        ApplicationContext.User.Identity.SessionID.ToString()
    );
HttpCookie cookie = 
   new HttpCookie(
       FormsAuthentication.FormsCookieName, 
       FormsAuthentication.Encrypt(ticket)
   );
cookie.Path = FormsAuthentication.FormsCookiePath;
cookie.HttpOnly = true;
Response.Cookies.Add(cookie);

如果我登录到外部web应用程序,然后导航到内部web应用程序中的页面,它会重定向到登录页面,并将Forms authentication failed for the request. Reason: The ticket supplied was invalid.写入服务器上的事件日志。

如何让内部ASP.NET 4.0 web应用程序接受ASP.NET 2.0 Forms Auth票证?

更新:它在HTTPS IIS 7.5下工作,但在HTTPS IIS 7.0下不工作。做更多的调查。

更新2:我们在服务器上应用了Server 2008 SP2以及最近针对哈希冲突DoS的补丁,从那时起,cookie共享就开始工作了。

ASP.NET 2.0站点中的ASP.NET 4.0应用程序是否可以使用相同的Forms Authentication

除了保持上述所有值几乎相同外,您还需要在4.0应用程序的配置文件中设置machineKey元素的compatibilityMode属性:

<machineKey compatibilityMode="Framework20SP2" validationKey="THE_KEY" decryptionKey="ANOTHER_KEY" validation="SHA1" />

我假设你读过这个-http://msdn.microsoft.com/en-us/library/eb0zx8fc.aspx-也许从4.0应用程序中删除ticketCompatibilityMode属性,或者至少确保它们相同。

将此应用程序设置添加到两个web.config文件中:

add key="aspnet:UseLegacyFormsAuthenticationTicketCompatibility"value="true"

您需要确保两个应用程序在web.config文件中具有相同的加密密钥

<machineKey
      validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" 
      decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" 
      validation="SHA1" />

跨应用程序的表单身份验证