Frage

Ich versuche, den Abschnitt "Informationen zu userData zu schreiben" implementieren Dieser Artikel, aber es funktioniert nicht richtig, wenn der Keks Teil des URI ist.

Mein Code:

// Create the cookie that contains the forms authentication ticket
HttpCookie authCookie = FormsAuthentication.GetAuthCookie( userName, createPersistantCookie );

// Get the FormsAuthenticationTicket out of the encrypted cookie
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt( authCookie.Value );

// Create a new FormsAuthenticationTicket that includes our custom User Data
FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket( ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, "foo");

// Update the authCookie's Value to use the encrypted version of newTicket
authCookie.Value = FormsAuthentication.Encrypt( newTicket );

// Manually add the authCookie to the Cookies collection
HttpContext.Current.Response.Cookies.Add( authCookie );

// Determine redirect URL and send user there
string redirUrl = FormsAuthentication.GetRedirectUrl( userName, createPersistantCookie );

HttpContext.Current.Response.Redirect( redirUrl, false );

Wenn Cookieless verwendet wird, leitet die Seite mit den Cookie -Informationen jedoch nicht die richtige URI aus, sodass sie zu meiner Anmeldeseite zurückgezogen wird. Isauthenticated gibt falsch zurück. Es kommt zu einer endlosen Schleife.

Wie leite ich mich auf den richtigen URI um?

War es hilfreich?

Lösung

Ich fand dies ein interessantes Problem, also machte ich mich daran, ein paar Graben, Testen und ein wenig Debuggen in die .NET -Framework -Quelle zu machen.

Grundsätzlich funktioniert das, was Sie versuchen, nicht. Alles, was Sie in die Antwort aufgenommen haben. Die Kochersammlung wird nur ignoriert, wenn der Browser keine Cookies unterstützt. Sie können die Anforderungen.Browser.cookies überprüfen, um festzustellen, ob Cookies unterstützt werden.

In ASP.NET unterstützen sowohl der Sitzungsstatus als auch die Authentifizierung einen Cookieless -Modus, dies erstreckt sich jedoch nicht auf andere Cookies. Tatsächlich scheint es, dass Sitzung und Authentifizierung selbst auf unterschiedliche Betriebsmodi festgelegt werden.

Das Authentifizierungssystem kann seine eigenen Daten in der URI speichern, aber es geschieht, indem es den URI selbst direkt manipuliert. Leider scheint Microsoft diese Funktionen nicht vorgelegt zu haben, um außerhalb des Authentifizierungsmoduls zu codieren.

Wenn Sie die Methoden wie formsAuthentication.getAuthcookie () und formsAuthentication.setAuthcookie () verwenden Authentifizierungskarte für diese Methoden ... Sie bleiben also mit dem Standard -Auth -Ticket. In diesen Fällen sind Sie alleine, um benutzerdefinierte Daten zu speichern.

Wie auch immer...

Das Speichern von benutzerdefinierten Daten direkt in einem Authentifizierungs -Ticket gibt es wirklich keinen großen Vorteil, wenn das Authentifizierungssystem Cookieless gegangen ist ... Im Cookieless -Modus haben Dinge wie "Persistant Cookie" keine Bedeutung, sodass Sie die Daten mindestens einmal regenerieren werden pro Sitzung sowieso.

Der häufigste Vorschlag für Fälle, in denen Sie Cookieless sind, aber weiterhin benutzerdefinierte Daten benötigen, besteht darin, Cookieless -Sitzungen zu ermöglichen und Ihre benutzerdefinierten Daten einfach als Sitzungsvariable zu speichern. Die Sitzungs -ID wird in den URI eingerichtet, aber die benutzerdefinierten Daten bleiben auf dem Server im Speicher. Das Verwendungsmuster ist identisch, egal ob Ihre Sitzungen Cookieless sind oder nicht.

Wenn Sie wirklich wollten, können Sie ein System zum Speichern der benutzerdefinierten Daten in der URI manuell erstellen. Am einfachsten wäre es, die benutzerdefinierten Daten in Abfragebräge zu setzen oder PathData zu verwenden. Ich kann keinen wirklichen Vorteil für diese Über -Sessions -Variablen sehen, es sei denn, Sie sind nur deperiert, um keinen Serverspeicher zu verwenden (ein kleiner Speicher zu einem Server ist billig, hässliche URLs und manuelles Code, um mit ihnen umzugehen, ist nicht billig).

Andere Tipps

Vielen Dank für die großartige Erklärung, Stephen. In Fällen, in denen der Benutzer keine Cookies erlaubt, muss ich nur die Benutzerdata vermeiden und die Daten aus der Datenbank laden.

Vor dem oben aufgeführten Code werde ich tun:

if( !HttpContext.Current.Request.Browser.Cookies || !FormsAuthentication.CookiesSupported )
{
    FormsAuthentication.RedirectFromLoginPage( userName, false);
    return;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top