2009-07-09 9 views
8

(siehe Frage unten für mehr Kontext):<machineKey decryptionKey = "AutoGenerate" ... wird von IIS ignoriert. Wird nicht vorherigen Sitzung Cookies ungültig

alle Situationen gibt, in denen

<machineKey 
     validationKey="AutoGenerate,IsolateApps" 
     decryptionKey="AutoGenerate,IsolateApps"/> 

in web.config scheitern würde eine neue machineKey auf App automatisch generieren Pool recyceln? Das ist das Verhalten, das ich sehe ...


Ich verwende Standard ASP.NET FormsAuthentication in einer MVC-App. Wenn ich einen Benutzer mit FormsAuthentication.GetAuthCookie anmelde und kein dauerhaftes Cookie verwende (basierend darauf, dass sich die Sitzung des Browsers an meinen autorisierten Status erinnert), würde ich erwarten, dass der IIS App Pool recycelt wird, um das Wissen der Sitzung über diesen Cookie ungültig zu machen ... und somit Melden Sie alle Benutzer ab, die keine dauerhaften Cookies haben.

Dies geschieht auf einer meiner IIS-Installationen (XP), aber auf einer anderen IIS-Konfiguration (Server 2K3) bleibt das FormsAuthentication-Cookie (unter dem Standardnamen ".ASPXAUTH") gültig und autorisiert den Benutzer weiterhin.

Weiß jemand, warum das passiert oder welche Konfiguration dieses Verhalten steuert?

Offensichtlich hat das Recyceln des App-Pools keine Kontrolle darüber, ob der Browser noch den .ASPXAUTH-Cookie sendet (solange ich meinen Browser nicht geschlossen habe und der Cookie nicht abgelaufen ist).

Im Fall des IIS installieren, dass die Authentifizierung nach einem Recycling ordnungsgemäß verweigert, ich den eingehenden Cookie in Request.Cookies während der Application_BeginRequest Ereignis sehen ... aber sobald die Steuerung bewegt sich auf die nächste Veranstaltung in Global.asax.cs (Application_AuthenticateRequest) wurde der Cookie aus der Request.Cookies Collection entfernt.

Warum passiert dies nicht für beide IIS/ASP.NET-Konfigurationen?


Falls dies nicht klar ist, ein einfacher Weg, um die Frage der Bildung ist:

Warum HttpContext.Current.Request.Cookies[".ASPXAUTH"] Wechsel von {System.Web.HttpCookie} auf null, wenn ich Schritt in einer einzigen Anfrage, Application_BeginRequest-Application_AuthenticateRequest?


Mehr Debug-Informationen:

Wenn lege ich den folgenden Code Global.asax.cs des FormsAuthentication_OnAuthenticate Ereignis ...

var cookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 
if (cookie != null) 
{ 
    var val = cookie.Value; 
    try 
    { 
     FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(val); 
    } 
    catch (Exception) 
    { 
    } 
} 

... dann während einer Anfrage vor I den IIS App Pool recyceln, wird keine Ausnahme abgefangen. Nach dem Recyceln des IIS-App-Pools wird, wenn genau derselbe .ASPXAUTH-Cookie vom Browser gesendet wird, eine kryptografische Ausnahme abgefangen ("Padding ist ungültig und kann nicht entfernt werden.")

Warum ist das?

+1

Ist eine für die Verwendung des ASP konfiguriert.NET State Service, um die Sitzung statt inproc zu speichern? – devstuff

+0

Guter Gedanke - nein, beide verwenden leider InProc. – kamens

Antwort

-2

Formulare Authentifizierungscookies haben nichts mit dem Sitzungsstatus zu tun.

+0

1) Wenn Sie Ihren App-Pool recyceln, wird Ihre Sitzung wiederverwendet (wenn Sie InProc-Sitzungsverwaltung verwenden), und dies manipuliert anscheinend * manchmal * den ASPXAUTH-Cookie (wie er nach dem BeginRequest-Ereignis entfernt wird). 2) Ich werde meine Frage deutlicher machen, indem ich "Browsersitzung" anzeige. Von MS-Dokumentation: createPersistentCookie Typ: System.Boolean True zum Erstellen eines dauerhaften Cookie (eine, die über Browsersitzungen gespeichert wird); sonst falsch. – kamens

+0

Unsinn. Cookies befinden sich auf Clients. Nichts, was Sie dem Server antun können, entfernt die auf den Clients gespeicherten Cookies. –

+0

Sie würden das denken, oder? Der Cookie wird nicht vom Server entfernt, bis Application_BeginRequest beendet ist. Ich weiß, wie lächerlich das klingt, weshalb ich diese Frage stelle. Ich habe einen Debugger auf, und wenn ich von Application_BeginRequest zu Application_AuthenticateRequest gehe, ändert sich der Wert von HttpContext.Current.Request.Cookies [". ASPXAUTH"] von {System.Web.HttpCookie} zu null. – kamens