如何设置表单身份验证cookie路径

时间:2012-04-09 08:39:10

标签: asp.net cookies forms-authentication

在同一个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应用程序开发人员都会遇到的常见问题,但我看不到合理的解决方案。请告诉我,我错过了一些明显的东西?

由于

安迪

2 个答案:

答案 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。