3 Stimmen

Ist es möglich, einen Token mit Nancy.Authentication.Token zu widerrufen?

Ich habe den Quellcode und die Tests durchgesehen, aber sehe keine Möglichkeit, ein Token zu widerrufen. Ich muss Szenarien abdecken, in denen ich den Zugriff für einen Benutzer deaktiviere und dies sofort geschehen muss.

Da das Token in keyChain.bin gespeichert ist, könnte es möglich sein, die Kollektionen zu deserialisieren, alle Tokens zu entfernen, das gewünschte zu entfernen und die Kollektion erneut zu serialisieren. Das klingt aufwendig. Gibt es andere Methoden, die ich verwenden könnte?

Aktualisierung

Möglicherweise kann ich eine separate Liste von Benutzer-IDs und dem ausgegebenen Token führen und dann das Token mit der keyChain-Kollektion abgleichen.

Aktualisierung 2

Nachdem ich mit der keyChain-Datei gespielt habe, wird die Sache etwas verwirrender. Nachdem ich einen neuen Benutzer erstellt habe, erteile ich ein Token aus:

var newServiceIdentity = siteSecurityManager.CreateServiceUser(user.UserId, user.Password)
                                                        .GetServiceIdentity();

string token = _tokenizer.Tokenize(newServiceIdentity, this.Context);
newServiceIdentity.Token = token;
siteSecurityManager.RegisterToken(newServiceIdentity);

var fileStore = new FileSystemTokenKeyStore(_rootPathProvider);
var allKeys = fileStore.Retrieve() as Dictionary;

return new { Token = token };

Standardmäßig speichert Nancy jedes Token in einer Binärdatei, sodass die Benutzersitzungen erhalten bleiben, falls der Server neu gestartet werden muss. Mit einer anderen Browsersitzung melde ich mich mit den Anmeldedaten des neuen Benutzers an und erhalte Zugriff auf die Seite. Wenn ich einen weiteren Benutzer hinzufüge, würde ich erwarten, dass die Anzahl der allKeys erhöht wird, um meine Admin-Sitzung sowie den neuen Benutzer, der mit einem anderen Browser verbunden ist, widerzuspiegeln. Ich sehe eine Anzahl von eins, und der Schlüssel entspricht dem Admin-Token.

Meine Anmelde-Methode erteilt tatsächlich für jeden Benutzer, der sich mit den richtigen Anmeldeinformationen verbindet, ein Token. Die Logik ist:

var userServiceIdentity = ServiceIdentityMapper.ValidateUser(user.UserId, user.Password);

if (userServiceIdentity == null)
{
   return HttpStatusCode.Unauthorized;
}
   else
{   
   string token = _tokenizer.Tokenize(userServiceIdentity, this.Context);
   return new { Token = token };
}

Ich speichere das Token und gebe es bei jedem Ajax-Aufruf zurück. Die Implikation hier ist, dass ich die Tokens aufgezeichnet habe, sonst würde die Authentifizierung fehlschlagen. Aber wenn keyChain.bin nicht aktualisiert wird, kann ich die Idee, das Token und den Benutzer in einem separaten Speicher zu registrieren und dann das Token zur Aufhebung des Zugriffs zu löschen, nicht verfolgen.

1voto

David Robbins Punkte 10000

Wie mir Jeff, dem Autor des Codes, erklärt hat, speichert keyChain.bin nur den Schlüssel, der zur Generierung des Tokens verwendet wird. Dies dient dazu, relevante Informationen nur auf dem Client zu speichern, und ein einfacher Vergleich des Client-Tokens wird verwendet, um Abfragen einer Backend-Quelle zu vermeiden. Jeffs vollständige Erklärung finden Sie hier

Eine mögliche Lösung könnte darin bestehen, eine separate Liste von gesperrten Tokens/Benutzern zu führen. Möglicherweise wird dies am besten durch Geschäftspraktiken vorgegeben. Es gibt tatsächlich Zeiten, in denen ein Benutzer sofort gesperrt werden sollte. Dies könnte erreicht werden, indem alle Tokens gelöscht werden und alle legitimen Benutzer zu einem erneuten Login gezwungen werden. Eine geringfügige Unannehmlichkeit für einige Szenarien und inakzeptabel für andere.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X