我正在尝试使用我在ASP.NET v2.0中找到的Membership Providers范例中找到的few tutorials来配置身份验证。我已经按照教程中的示例进行操作,但似乎无法使FormsAuthentication.RedirectFromPage
方法正常工作。当我尝试登录时,通过Membership.ValidateUser
验证用户凭据,但页面将发送回Login.aspx而不是Default.aspx。以下是我的web.config中的相关代码段:
...
<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 Login控件。以下是authenticate事件处理程序代码:
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
我错过了配置步骤吗?
答案 0 :(得分:1)
问题出在path =“/ FormsAuth”参数中。 删除此变量,然后重试
Read this post关于道路可能出错的原因
来自MSDN: path - 可选属性。指定应用程序发出的cookie的路径。默认值为斜杠(/),因为大多数浏览器区分大小写,如果路径不匹配,则不会发回cookie。
注意:path属性区分大小写。因此,如果您将path属性的值设置为/ application1,并且应用程序名称是Application1,则身份验证cookie路径为/ application1。
因此,如果要使用path属性,则应将其设置为“/ project”,因为Project是应用程序的名称(据我所知)。但是,当您使用不同的cookie名称时,我认为您不需要有不同的路径(例如,在此应用程序中名称=“POTOKCookie”,我希望与安装在同一主机上的其他ASP.NET应用程序不同)
请参阅PRB: Forms Authentication Requests Are Not Directed to loginUrl Page
答案 1 :(得分:0)
如果使用具有ASP.NET成员身份的Login控件,则无需编写代码来执行身份验证。但是,如果要创建自己的身份验证逻辑,可以处理Login控件的Authenticate事件并添加自定义身份验证代码。
所以,我建议你只要删除Login1_Authenticate事件,就像双重工作一样,我认为,因为控件本身负责调用ValidateUser和重定向。
同时检查Login控件的DestinationPageUrl属性
如果您没有为DestinationPageUrl属性指定值,则用户将在成功登录后重定向到用户请求的原始页面。因此,在您的情况下,不应设置此属性。