尽管测试成功,但表单身份验证失败
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 在他们的网站上,关于这个问题,但下面详细介绍了它的长短...
- ControlRenderingCompatibilityVersion Setting in the Web.config File
- ClientIDMode Changes
- HtmlEncode and UrlEncode Now Encode Single Quotation Marks
- ASP.NET Page (.aspx) Parser is Stricter
- Browser Definition Files Updated
- System.Web.Mobile.dll Removed from Root Web Configuration File
- ASP.NET Request Validation
- Default Hashing Algorithm Is Now HMACSHA256
- Configuration Errors Related to New ASP.NET 4 Root Configuration
- ASP.NET 4 Child Applications Fail to Start When Under ASP.NET 2.0 or ASP.NET 3.5 Applications
- ASP.NET 4 Web Sites Fail to Start on Computers Where SharePoint Is Installed
- The HttpRequest.FilePath Property No Longer Includes PathInfo Values
- ASP.NET 2.0 Applications Might Generate HttpException Errors that Reference eurl.axd
- Event Handlers Might Not Be Not Raised in a Default Document in IIS 7 or IIS 7.5 Integrated Mode
- Changes to the ASP.NET Code Access Security (CAS) Implementation
- MembershipUser and Other Types in the System.Web.Security Namespace Have Been Moved
- Output Caching Changes to Vary * HTTP Header
- System.Web.Security Types for Passport are Obsolete
- The MenuItem.PopOutImageUrl Property Fails to Render an Image in ASP.NET 4
- Menu.StaticPopOutImageUrl and Menu.DynamicPopOutImageUrl Fail to Render Images When Paths Contain Backslashes
我的任务是将 .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 在他们的网站上,关于这个问题,但下面详细介绍了它的长短...
- ControlRenderingCompatibilityVersion Setting in the Web.config File
- ClientIDMode Changes
- HtmlEncode and UrlEncode Now Encode Single Quotation Marks
- ASP.NET Page (.aspx) Parser is Stricter
- Browser Definition Files Updated
- System.Web.Mobile.dll Removed from Root Web Configuration File
- ASP.NET Request Validation
- Default Hashing Algorithm Is Now HMACSHA256
- Configuration Errors Related to New ASP.NET 4 Root Configuration
- ASP.NET 4 Child Applications Fail to Start When Under ASP.NET 2.0 or ASP.NET 3.5 Applications
- ASP.NET 4 Web Sites Fail to Start on Computers Where SharePoint Is Installed
- The HttpRequest.FilePath Property No Longer Includes PathInfo Values
- ASP.NET 2.0 Applications Might Generate HttpException Errors that Reference eurl.axd
- Event Handlers Might Not Be Not Raised in a Default Document in IIS 7 or IIS 7.5 Integrated Mode
- Changes to the ASP.NET Code Access Security (CAS) Implementation
- MembershipUser and Other Types in the System.Web.Security Namespace Have Been Moved
- Output Caching Changes to Vary * HTTP Header
- System.Web.Security Types for Passport are Obsolete
- The MenuItem.PopOutImageUrl Property Fails to Render an Image in ASP.NET 4
- Menu.StaticPopOutImageUrl and Menu.DynamicPopOutImageUrl Fail to Render Images When Paths Contain Backslashes