尽管测试成功,但表单身份验证失败

Forms authentication fails despite successful test

我的任务是将 .NET 3.5 应用程序从我们的一些旧服务器迁移到他们在 IIS 8.5 级别服务器上的新家,不出所料,其中一些根本不会 运行。

为了缓解这种情况,我已将所有文件导入到一个新项目中,并 运行 检查所有错误、警告和消息,解决问题。

应用程序现在启动,但是,登录过程(典型的 .NET 登录过程,使用 FormsAuthentication.RedirectFromLoginPage(UserName.Text, True) 根本不起作用;它不会对用户进行身份验证。

web.config 文件在 authorization 部分有以下条目:

<anonymousIdentification enabled="false" />
...
<httpModules>
    <add name="ScriptModule" 
        type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, 
        PublicKeyToken=31BF3856AD364E35"/>
    <add name="FormsAuthentication" 
        type="System.Web.Security.FormsAuthenticationModule" />
</httpModules>
...
<authentication mode="Forms">
    <forms loginUrl="Default.aspx" 
        defaultUrl="default.aspx" 
        slidingExpiration="true" 
        timeout="20" 
        name="FORMSAUTHCOOKIE" 
        protection="All" />
</authentication>
...
<authorization>
    <allow users="*"/>
    <deny users="?"/>
</authorization>

我已经用一些虚拟变量修改了后面的代码,以便我用手表等进行监控...

 1    If row.ItemArray.Length <> 0 And Not row("Suspended") Then
 2        Session("isadmin") = row("Administrator")
 3        Session("email") = row("Email")
 4        Session("welcome") = row("Forename") & " " & row("Surname") & "  (" & row("Department") & "), logged in"
 5        uAdapter.UpdateLastLogin(row("UserName"), row("Password"))
 6        FormsAuthentication.RedirectFromLoginPage(UserName.Text, True)
 7        Dim y As Boolean = Request.IsAuthenticated
 8        Dim x As HttpCookieCollection = Request.Cookies
 9        Dim z As HttpCookie = Request.Cookies.Item("FORMSAUTHCOOKIE")
10        Dim a As Int32 = -1
11    Else
12        Msg.Text = "Invalid login details. Please try again."
13    End If

第 7 行到第 10 行用于测试和读取代码中不存在的其他值。尽管 FormsAuthentication.RedirectFromLoginPage(UserName.Text, True) 执行没有错误,但它不会重定向到当前页面以外的任何其他页面,即使有来自其他地方的引用也是如此。此外,第 7 行在执行时有一个 False 结果。

没有错误消息。正在从连接返回数据。两个版本的系统在格式上有差异,不过我把这个归结为IIS上的渲染。

任何人都可以发现任何明显的为什么这不起作用吗?我错过了什么地方吗?

更多详情

除了 David 的回答之外,我在下面使用直接 ReturnUrl 进行了测试并单步执行了代码...

来自 MSDN 文档的备注部分 (link):

By default, the ReturnUrl variable must refer to a page within the current application. If ReturnUrl refers to a page in a different application or on a different server, the RedirectFromLoginPage methods redirects to the URL in the DefaultUrl property. If you want to allow redirects to a page outside the current application, you must set the EnableCrossAppRedirects property to true using the enableCrossAppRedirects attribute of the forms configuration element.

这是我的猜测:

  • ReturnUrl 未在查询字符串中定义。
  • ReturnUrl 指向旧服务器上的一个页面。

很有可能是后者。

好的。经过大量研究和许多精彩的附带问题,我遇到的问题归结为 breaking changes in .NET 4.0

Microsoft goes into a lot more detail 在他们的网站上,关于这个问题,但下面详细介绍了它的长短...