7

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

谢谢

安迪

4

2 回答 2

9

我假设您已经以某种方式解决了这个问题,但是由于我偶然发现了这个问题,我想我应该加几分钱。

要解决此问题,请在 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>
于 2012-12-14T14:10:01.410 回答
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。

于 2012-04-09T08:48:59.997 回答