SetAuthCookie schafft im Grunde eine neue FormsAuthenticationTicket mit den Optionen angegebenen Benutzernamen & Persistenz, serialisiert es, FormsAuthentication.Encrypt() 's es und setzt es in der Response.Cookies Sammlung. SetAuthCookie und GetAuthCookie rufen beide FormsAuthentication.Encrypt indirekt auf.
Bei nachfolgenden Anfragen behandelt die FormsAuthentiationModule das AuthenticateRequest Ereignis. Wenn ein Cookie erkannt wird (der möglicherweise abgelaufen ist), wird versucht, den Wert mit dem Computerschlüssel zu entschlüsseln (möglicherweise manipuliert) und in ein FormsAuthenticationTicket zu deserialisieren (möglicherweise beschädigt). Wenn nichts von dem (schlechten Zeug) passiert, enthält das Ticket den Benutzernamen, das Ausstellungsdatum, die Ablaufinfo usw. Wenn das Ticket nicht abgelaufen ist, werden ein IIdentity und IPrincipal erstellt und HttpContext.Current.User und Thread zugewiesen. CurrentThread.Principal. In .NET 4.5 und später (denke ich) ist dies Claims-Based (ClaimsIdentity, ClaimsPrincipal). Zuvor war es ein (GenericPrincipal, FormsIdentity), denke ich.
überhaupt auf der Benutzerseite Manipulation bewirkt, dass die Anfrage als anonym behandelt werden. Es kann nicht entschlüsselt werden. Die einzigen Dinge, die diese Validierung beeinträchtigen würden, wären, wenn der computerKey in web.config/machine.config irgendwie in die Hände eines Angreifers geraten wäre oder wenn ein Fehler im Framework-Code vorgelegen hätte (suchen Sie für ein historisches Beispiel nach Padding Oracle)).
Abgesehen davon, die andere Sache, auf die man achten sollte, wäre Session-Hijacking. Wenn jemand Ihr Cookie zum Beispiel auf einem öffentlichen WLAN-Gerät stiehlt, kann es es dem Server präsentieren und der Server verhält sich so, als ob Sie es wären. Dies beinhaltet im Allgemeinen Netzwerkverkehr-Sniffing. Aus diesen Gründen empfiehlt es sich, SSL für Ihre gesamte Website zu verwenden und den Cookie in web.config/system.web/authorisation/forms nur auf HTTP und Secure (nur über https-Verbindungen bereitgestellt) zu setzen. HTTP bedeutet nur, dass es für clientseitiges JavaScript nicht verfügbar ist. Nur HTTP und Sicher bedeutet nur HTTPS. Dies funktioniert nur, wenn Sie SSL auf Ihrer gesamten Website verwenden.
FormsAuthentication funktioniert problemlos in mobilen Webbrowsern. Es erfordert lediglich, dass der Client Cookies akzeptiert. Soweit ich weiß, erlauben dies alle mobilen Geräte.
In Bezug Sitzung Entführung wird die AuthCookie beeinträchtigt werden, wenn einige Teile von meiner Seite ist öffentlich und einige sichere dh https (nur zugänglich für eingeloggte Benutzer). Ich frage das, weil ich weiß, sobald der AuthCookie erstellt wird, geht es bei jedem Client-Server-Aufruf hin und her. Gibt es eine Möglichkeit, das auf bestimmten Seiten zu vermeiden? Mein Plan ist, den Authentifizierungsschritt als ein Filter in meinem app_start zu registrieren; und mache ein paar Aktionen [anonymous] ... deine Gedanken (danke für deine wunderbare Antwort übrigens!) – DotNet98
Du kannst die Path-Option in system.web/authorization/forms verwenden, um zu bewirken, dass das Cookie nur für einen bestimmten Pfad auf deiner Seite angezeigt wird Seite? ˅. Leider sind Sie auf 1 Pfad beschränkt. Wenn Sie also einen Bereich Ihrer Site haben, an dem Sie den anonymen Zugriff zulassen möchten, und einen anderen, der eine Authentifizierung/Autorisierung erfordert, können Sie den gesamten sicheren Inhalt unter einem separaten Pfad ablegen und den Cookie auf diesen Pfad beschränken.Sie möchten es dennoch auf "secure" und "http" setzen. Der Cookie-Pfad ist der zuverlässigste Weg, um sicherzustellen, dass sich Ihr Cookie nicht über einen freien Kanal bewegt. – scottt732
Ja, scheint wie https ist der Weg zu gehen. Ich denke, ich kann https-Seiten haben, ohne den Benutzer zu authentifizieren; Ich gehe davon aus, dass dies aufgrund der Art von https Auswirkungen auf die Leistung haben wird. Wirst du etwas Licht in das Thema meiner AJAX-Anrufe bringen? Muss ich irgendetwas speziell tun, um meine Ajax-Anrufe zu schützen (wird AutCookie mit meinen Ajax-Anrufen reisen) – DotNet98