【问题标题】:how to set the forms authentication cookie path如何设置表单身份验证 cookie 路径
【发布时间】:2012-04-09 08:39:10
【问题描述】:

在同一个 IIS 网站上,我有两个名为 /foo 和 /bar 的 ASP.NET Web 应用程序。两者都使用表单身份验证,我希望用户能够独立登录和退出两个站点。

使用表单身份验证的标准配置,它似乎为表单身份验证 cookie 发送了一个“/”的 cookie 路径。这意味着当用户登录 /bar 时,它会将他从 /foo 中注销,这对我来说是不受欢迎的行为。

显而易见的解决方案似乎是这样的:

FormsAuthentication.RedirectFromLoginPage(username, false, Request.ApplicationPath);

这使得表单身份验证 cookie 具有允许用户独立登录 /foo 和 /bar 的应用程序路径 :-) 但是还有一个更严重的问题:如果用户尝试登录 /Foo(使用大写 F),IIS 将它们定向到 Web 应用程序 /foo,但它们永远无法登录,因为浏览器(本例中为 chrome)在根据 cookie 路径决定是否发送 cookie 时区分大小写。

这似乎是每个 ASP.NET Web 应用程序开发人员都会面临的常见问题,但我看不到一个明智的解决方案。请告诉我我漏掉了什么明显的东西?

谢谢

安迪

【问题讨论】:

  • 更新:我发现了这个msdn.microsoft.com/en-us/library/1d3t3c61.aspx。它明确指出默认 cookie 路径是 / 出于区分大小写的原因,所以基本上是的,这是一个基本问题,没有一个简单的通用答案

标签: asp.net cookies forms-authentication


【解决方案1】:

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

要解决此问题,请在 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>

【讨论】:

  • 哇,这太明显了,我因为之前没有想到它而自责。显然,我将不得不对会话 cookie 做一个类似的把戏。我意识到这不是我的问题的直接解决方案,但因为我不能保证对我的应用程序的所有访问都将使用区分大小写的 URL,所以没有直接的解决方案,这是最容易实现的。感谢 user1429080 :-)
  • 我遇到了一个问题,我有一个虚拟目录(这是一个 MVC 应用程序),然后是一个嵌套的 VD(也是一个 MVC 应用程序),并且登录到子应用程序会杀死父级中的 cookie一。这对我来说非常优雅地解决了这个问题。谢谢!
  • 虽然上述解决方案可以工作,但请注意,如果您最终使用两个应用程序进行身份验证,则上述解决方案将产生每个请求都携带两个 cookie 的开销。正确设置 cookie 路径将是正确的解决方案。
  • 注意,您可以通过编程方式设置 cookie 名称。这里的例子stackoverflow.com/a/37182218/242142
【解决方案2】:
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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 2014-04-01
    相关资源
    最近更新 更多