在同一个IIS网站上,我有两个名为/ foo和/ bar的ASP.NET Web应用程序。两者都使用表单身份验证,我希望用户能够独立登录和退出两个站点。
使用表单身份验证的标准配置,它似乎为表单身份验证cookie发送“/”的cookie路径。这意味着当用户登录/ bar时,它会将他从/ foo中记录下来,这对我来说是不受欢迎的行为。
显而易见的解决方案似乎是:
FormsAuthentication.RedirectFromLoginPage(username, false, Request.ApplicationPath);
这使得表单auth cookie具有允许用户独立登录/ foo和/ bar的应用程序路径:-)但是还有一个更令人讨厌的问题:如果用户尝试登录/ Foo(与一个资本F),IIS将它们引导到web应用程序/ foo,但它们永远无法登录,因为浏览器(在这种情况下为chrome)在决定是否根据cookie路径发送cookie时区分大小写。
这似乎是每个ASP.NET Web应用程序开发人员都会遇到的常见问题,但我看不到合理的解决方案。请告诉我,我错过了一些明显的东西?
由于
安迪
答案 0 :(得分:7)
我认为你已经以某种方式解决了这个问题,但是由于我偶然发现了这个问题,我认为我应该加上我的几分钱。
要解决此问题,请在web.config中使用不同的cookie名称。类似的东西:
<authentication mode="Forms">
<forms name=".ASPXFORMSAUTH_FOO"
loginUrl="public/login.aspx" cookieless="UseCookies" slidingExpiration="true"/>
</authentication>
和
<authentication mode="Forms">
<forms name=".ASPXFORMSAUTH_BAR"
loginUrl="public/login.aspx" cookieless="UseCookies" slidingExpiration="true"/>
</authentication>
答案 1 :(得分:1)
Dim ticket As FormsAuthenticationTicket = New FormsAuthenticationTicket(1, _
pUsernameEntered, _
DateTime.Now, _
DateTime.Now.AddMinutes(60), _
True, _
pOperatorID, _
FormsAuthentication.FormsCookiePath)
' Encrypt the ticket.
Dim encTicket As String = FormsAuthentication.Encrypt(ticket)
'create a cookie with the encrypted ticket
Dim authenticationCookie As New HttpCookie(FormsAuthentication.FormsCookieName, encTicket)
'only create a persistent cookie if ticket persistent is checked
If (ticket.IsPersistent) Then
'give the cookie an expiration date outside of the forms authentication encrypted ticket
authenticationCookie.Expires = ticket.Expiration
End If
'save the cookie
HttpContext.Current.Request.Cookies.Remove(".cookiename")
Response.Cookies.Add(authenticationCookie)
在cookiename中,您可以设置cookie名称。
在AddMinutes
中,您可以设置当前的分钟值为60。