2012-04-09 48 views
4

在同一個IIS網站上,我有兩個名爲/ foo和/ bar的ASP.NET Web應用程序。兩者都使用表單身份驗證,我希望用戶能夠獨立登錄和註銷這兩個站點。如何設置表單身份驗證Cookie路徑

通過表單身份驗證的標準配置,它似乎爲表單身份驗證cookie發送「/」的cookie路徑。這意味着當用戶登錄到/ bar時,它會將他從/ foo中註銷,這對我來說是不受歡迎的行爲。

顯而易見的解決方案似乎是這樣的:

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

這使得形式AUTH餅乾有應用程序的路徑,其允許用戶登錄到/ foo和/棒獨立地:-)但是有進一步的和更加討厭的問題:如果用戶嘗試登錄到/ Foo(使用大寫字母F),IIS將它們引導到Web應用程序/ foo,但它們永遠不能登錄,因爲瀏覽器(在這種情況下爲chrome)區分大小寫根據cookie路徑決定是否發送cookie。

這似乎是每個ASP.NET Web應用程序開發人員都會遇到的常見問題,但我無法看到它的明智解決方案。請告訴我,我錯過了明顯的東西?

感謝

安迪

+0

更新:我發現這個http://msdn.microsoft.com/en-us/library/1d3t3c61.aspx。它明確指出默認的Cookie路徑是/爲了區分大小寫的原因,所以基本上是肯定的,這是一個基本的問題,沒有一個簡單的通用答案 – Andy 2012-04-16 09:18:48

回答

5

我假設你已經解決了這個問題,不知怎麼的,但因爲我偶然發現了這個問題,我想我要補充我的幾美分。

要解決該問題,請在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> 
+0

哇,這是如此明顯我踢自己沒有想到它之前。很明顯,我將不得不對會話cookie做類似的伎倆。我意識到這不是我的問題的直接解決方案,但因爲我不能保證所有對我的應用程序的訪問都將使用區分大小寫的URL,所以沒有直接的解決方案,這是最容易實現的。謝謝user1429080 :-) – Andy 2012-12-14 17:28:58

+0

我有一個問題,我有一個虛擬目錄(這是一個MVC應用程序),然後嵌套的VD(也是一個MVC應用程序),並登錄到子應用程序殺死父母的cookie。這已經爲我解決了這個問題。謝謝! – kmcoulson 2015-03-23 14:20:28

+1

儘管上面的解決方案可行,但請注意,如果您最終對兩個應用程序進行身份驗證,上述解決方案將會產生開銷,即每個請求都會攜帶兩個Cookie。正確設置cookie路徑將是正確的解決方案。 – 2015-09-15 10:50:56

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

相關問題