c# - 表单例份验证 - 共享 Cookie MVC 和 Web 表单

标签 c# asp.net-mvc cookies webforms

我在同一个域中有两个应用程序,如下所示:

http://example.com/MvcApp
http://example.com/WebFormsApp

不出所料,一个是 ASP.NET MVC 5,另一个是 Web Forms,两者都使用 .NET framework 4.6.1。

MVC 应用

在 ASP.NET MVC 5 中,我像这样创建表单例份验证 cookie:

var ticket = new FormsAuthenticationTicket(1,
    userName,
    DateTime.Now,
    DateTime.Now.AddMinutes(30),
    true,
    userData,
    FormsAuthentication.FormsCookiePath
);

var encTicket = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
Response.Cookies.Add(cookie);

我的 web.config 看起来像这样:

<system.web>
  <authentication mode="Forms">
    <forms name=".ASPXFORMSAUTH" loginUrl="/Account/Login" defaultUrl="default.aspx" protection="All" timeout="60" path="/" requireSSL="false" slidingExpiration="true" enableCrossAppRedirects="false" cookieless="UseDeviceProfile"/>
  </authentication>
  <compilation debug="true" targetFramework="4.6.1" />
  <httpRuntime targetFramework="4.6.1" />
  <machineKey validationKey="D011D22E385D3BC154D5CF0FCC15EF4843A468FB866FD6EEC533E1E30E6F097232DD9698E62DE6F176BA0DAB9E6925089EB25B20C57C659DD52F78DC025E192B" decryptionKey="5A350E0E7EDF07E5633B492B2F1A17ABC4DF5CF55C8922BD021C344ACE66CA42" validation="SHA1" decryption="AES"/>
</system.web>

网络表单应用

在网络表单应用程序中,web.config 如下所示:

<system.web>
  <globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="pt-BR"/>
  <customErrors mode="Off"/>
  <authentication mode="Forms">
    <forms name=".ASPXFORMSAUTH" loginUrl="che-login-win.aspx" defaultUrl="default.aspx" protection="All" timeout="60" path="/" requireSSL="false" slidingExpiration="true" enableCrossAppRedirects="false" cookieless="UseDeviceProfile"/>
  </authentication>
  <identity impersonate="true"/>
  <authorization>
    <deny users="?"/>
  </authorization>
  <machineKey validationKey="D011D22E385D3BC154D5CF0FCC15EF4843A468FB866FD6EEC533E1E30E6F097232DD9698E62DE6F176BA0DAB9E6925089EB25B20C57C659DD52F78DC025E192B" decryptionKey="5A350E0E7EDF07E5633B492B2F1A17ABC4DF5CF55C8922BD021C344ACE66CA42" validation="SHA1" decryption="AES"/>
  <httpRuntime requestValidationMode="2.0" maxRequestLength="8192" executionTimeout="9999"/>
</system.web>

您可能已经注意到,两个 web.configs 都对 forms 标记使用相同的名称,并且它们使用相同的机器 key 属性。它们驻留在我的 IIS 中的同一网站内,在同一域下(没有子域)。

当我登录 MVC 应用程序时,如果我打开浏览器控制台,我可以在那里看到我在 web.config 中设置的名称的 Cookie。

但是,如果我打开网络表单应用程序,它会将我重定向到登录页面,就好像我没有登录一样。当我在网络表单应用程序选项卡中打开浏览器控制台时,我可以在那里看到 cookie好吧。

Web 表单项目有一个登录页面,它创建 Forms Ticket 和 Cookie,就像 MVC 一样,当我从那里登录时,它可以工作。

我错过了什么?

最佳答案

我目前正在努力解决这个完全相同的问题。如果您的示例可以正常工作,请发布解决方案。

根据相关的 MSDN 文档,您似乎已经完成了所需的一切:

Unless otherwise noted, the name, protection, path, validationKey, validation, decryptionKey, and decryption attributes must be identical across all applications. Similarly, the encryption and validation key values and the encryption scheme and validation scheme used for authentication tickets (cookie data) must be the same. MSDN source

正如 @NightOwl888 在评论中提到的,您需要在两个应用程序中设置 enableCrossAppRedirects= true

https://learn.microsoft.com/en-us/dotnet/api/system.web.security.formsauthentication.enablecrossappredirects?view=netframework-4.7.2

我找到了 this older SO question有帮助。这最终在我们的测试服务器上为我工作,但在生产环境中不起作用。必须有其他未记录的相关设置。

关于c# - 表单例份验证 - 共享 Cookie MVC 和 Web 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49536435/

相关文章:

c# - asp.net mvc中写查询的正确位置

c# - 使用静态/集中类关闭 WCF 连接

asp.net-mvc - 如何从 MVC 页面引用 Razor 页面部分 View ?

c# - MVC View 没有将模型传回 Controller ,出现奇怪的错误?

javascript - Cookie 向下滑动 div 并在重新加载时记住

asp.net-mvc - Asp.net Core OpenIdConnect (OIDC) 在哪里验证状态参数

c# - 如何将字符串 "dd.MM.yyyy HH:mm:ss.mmm"转换为 C# 中的日期时间

c# - WP7.8 : Bound items in scrollbox updated with wrong data

asp.net-mvc - 将分组的 linq 对象传递给 View

rest - 使用nodejs获取cookie