【问题标题】:ASP.NET SqlMembershipProvider Infinite Loop?ASP.NET SqlMembershipProvider 无限循环?
【发布时间】:2009-08-18 16:34:48
【问题描述】:

我正在尝试使用 few tutorials 配置身份验证,我在 ASP.NET v2.0 中的 Membership Providers 范例中找到。我已经按照教程中的示例进行操作,但似乎无法让 FormsAuthentication.RedirectFromPage 方法正常工作。当我尝试登录时,用户凭据通过Membership.ValidateUser 进行验证,但页面被发送回 Login.aspx 而不是 Default.aspx。这是我的 web.config 中的相关 sn-p:

...
<authentication mode="Forms">
  <forms loginUrl="Login.aspx" protection="All" timeout="60" name="POTOKCookie" requireSSL="false" path="/FormsAuth"
         slidingExpiration="true" cookieless="UseCookies" enableCrossAppRedirects="false" defaultUrl="~/Default.aspx"/>
</authentication>
<authorization>
  <deny users="?" />
</authorization>
...
<membership defaultProvider="CustomizedProvider">
  <providers>
    <clear />
    <add name="CustomizedProvider"
         type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
         connectionStringName="LoginDB2"
         applicationName="POTOK"
         minRequiredPasswordLength="5"
         minRequiredNonalphanumericCharacters="0" />
  </providers>
</membership>

我已经验证我的连接字符串是正确的(因为 Membership.ValidateUser 似乎工作得很好)并且我在我的 Login.aspx 页面上为 UI 使用了 ASP.NET 登录控件。这是验证事件处理程序代码:

Protected Sub Login1_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) Handles Login1.Authenticate
    If (Membership.ValidateUser(Login1.UserName, Login1.Password)) Then
        FormsAuthentication.RedirectFromLoginPage(Login1.UserName, Login1.RememberMeSet)
    End If
End Sub

当我访问网址 (http://localhost/Project) 时,我被带到:http://localhost/Project/Login.aspx,在“登录”之后,我的网址是:http://localhost/Project/Login.aspx?ReturnUrl=%2fProject%2fDefault.aspx

我错过了配置步骤吗?

【问题讨论】:

    标签: asp.net cookies sqlmembershipprovider


    【解决方案1】:

    问题出在 path="/FormsAuth" 参数中。 删除此变量并重试

    Read this post关于为什么路径可能错误

    来自 MSDN: path - 可选属性。指定应用程序发出的 cookie 的路径。默认为斜杠 (/),因为大多数浏览器都区分大小写,如果路径大小写不匹配,则不会发回 cookie。

    注意:路径属性区分大小写。因此,如果您将path属性的值设置为/application1,并且如果应用程序名称为Application1,则认证cookie路径为/application1。

    所以如果你想使用路径属性,你应该将它设置为“/project”,因为 Project 是你的应用程序的名称(据我所知)。但是我认为当你使用不同的cookie名称时你不需要有不同的路径(即这个应用程序中的name="POTOKCookie",我希望与安装在同一主机上的其他ASP.NET应用程序不同)

    见PRB: Forms Authentication Requests Are Not Directed to loginUrl Page

    【讨论】:

    • 我没有删除我之前的答案,因为它也是有效的,你不需要为 Authenticate 事件编写任何代码你使用带有 ASP.NET 成员资格的 Login 控件,但它不是你的问题的实际来源。问题出在 cookie 上。
    【解决方案2】:

    如果您使用具有 ASP.NET 成员资格的登录控件,则无需编写代码来执行身份验证。但是,如果您想创建自己的身份验证逻辑,您可以处理 Login 控件的 Authenticate 事件并添加自定义身份验证代码。

    所以,我认为,我建议您只需删除 Login1_Authenticate 事件,因为它可以完成双重工作,因为控件本身负责调用 ValidateUser 和重定向。

    还要检查 Login 控件的 DestinationPageUrl 属性

    如果您没有为 DestinationPageUrl 属性指定值,则用户将在成功登录后被重定向到用户请求的原始页面。因此在您的情况下,不应设置此属性。

    【讨论】:

    • 我删除了 Login1_Authenticate 事件并确保未指定 DestinationPageUrl 属性并且仍然得到相同的行为。
    猜你喜欢
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    相关资源
    最近更新 更多