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.