Web-API 2, OWIN-Authentifizierung, SignOut meldet sich nicht ab
Ich mache einige der Forschung, für Arbeit mit Blick auf die mithilfe von Bearer-Token als Authentifizierungsmechanismus (z.B. AngularJS UI, authentifiziert über OWIN in einer Web-API [2] - Projekt).
Ich habe das login funktioniert Prima, Rolle, Informationen und alles, das ist in Ordnung, aber ich Schaffe es nicht, das token auf "Abmelden".
Mein Start-Konfiguration ist diese:
OAuthOptions = new OAuthAuthorizationServerOptions() {
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId),
AccessTokenExpireTimeSpan = SESSION_TIMEOUT,
AllowInsecureHttp = true
};
Sowie mein logout-Aktion ist einfach:
public HttpResponseMessage Logout() {
var authentication = HttpContext.Current.GetOwinContext().Authentication;
authentication.SignOut(DefaultAuthenticationTypes.ExternalBearer);
return new HttpResponseMessage(HttpStatusCode.OK);
}
Habe ich Links die Authentifizierung Zeug für die Kürze, aber zu bestätigen, ich bin mit ExternalBearer beim einrichten des token.
In meinem UI, ich bin die Speicherung der token im lokalen Speicher (es werden keine cookies beteiligten hier, das ist eine bewusste design-Entscheidung). Also ich habe ein logout - button auf die eigene UI, die Logout Aktion ist der hit und der code läuft wunderbar.
Jedoch wenn ich anschließend trifft der eine Aktion auf die API, Bedarf der Genehmigung, der Antrag geht noch durch (D. H. der Benutzer ist immer noch authentifiziert, auch wenn Sie sollte wurden abgemeldet.
Entweder fehlt mir etwas wirklich offensichtlich (wäre nicht das erste mal 😉 oder es gibt etwas grundlegenderes hier Los ist, schließlich bin ich Ping @leastprivilege wie ich weiß, das ist Ihr Gebiet.
Jede Hilfe oder Einsicht wäre dankbar angenommen.
Einzige was ich mir vorstellen kann ist, dass das token Staatenlosen auf dem server/API-Seite und kann daher nicht abgelaufen oder abgemeldet.
Wenn das der Fall ist ich denke, ich könnte entweder:
a) Fügen Sie einen refresh-token, das erstellt ein neues token, das läuft in die Vergangenheit - würden diese auch funktionieren? - eigentlich Abbrechen hätte, wäre es die Ausgabe eines neuen token ... die alte müsste man noch gültig
b) Speichern der bearer-token in der Datenbank aus und prüfen Sie jedes mal, entfernen Sie das token auf logout (natürlich gesalzen, gehasht, etc). Dies ist aber nur bringt uns zurück zu einer stateful-server.
c) ich kann (und will) das entfernen werden die token aus dem lokalen Speicher, wenn jemand explizit abmeldet, jedoch ist der token noch technisch gültig, wenn einen Fiesling das token herausfindet. Natürlich sind alle die oben über SSL sowieso, die sollten hemmen die bösen Jungs/Mädchen.
d) Vielleicht ist das, warum viele Menschen sind die Speicherung von den Inhaber-token in einem cookie (als storage-Verfahren), so dass, sobald Sie logout als zuletzt, wird das cookie entfernt, der nächsten Aktualisierung.
Sorry das oben ist ein bisschen wie ein Gehirn-dump, die gerade wollen, um pre-empt Fragen
InformationsquelleAutor der Frage toepoke.co.uk | 2014-07-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seit OAuth ist nicht ein Authentifizierungs-Protokoll, es ist keine Vorstellung von signout. Löschen Sie den access-token auf dem client - das ist alles, was Sie tun können.
Wenn Sie möchten, erlischt die token auf der server-Seite, fügen Sie eine einzigartige id, um es und behalten Sie den überblick in Ihrem service - müssen Sie manuell bauen sowas.
InformationsquelleAutor der Antwort leastprivilege
Habe ich eine schöne Lösung hier: http://www.nakov.com/blog/2014/12/22/webapi-owin-identity-custom-login-service/. Es ist benutzerdefinierten session-Implementierung für Web-API-OAuth-bearer-token Autorisierung basierend auf OWIN und der standard ASP.NET Identität (Microsoft.AspNet.Identität.EntityFramework). Es funktioniert wie die meisten Menschen erwarten dürfen:
Volle Funktion der source-code ist verfügbar auf GitHub: https://github.com/SoftUni/SPA-with-AngularJS/tree/master/Ads-REST-Services
InformationsquelleAutor der Antwort Svetlin Nakov
Diese Frage ist hier schon seit Ewigkeiten (und beantwortet), aber ich wollte nur läuten in meine Gedanken.
Ich würde tun, wie Ihr (C) option, aber mit einem kürzeren Ablauf auf den Träger Zugriffstoken so etwas wie 10 oder 20 Minuten, so dass, wenn Sie haben sich abgemeldet und gelöscht werden die token auf dem client, obwohl technisch der token noch gültig ist, der böse Mann wird nur der Rest, der den Ablauf der Zeit zu spielen mit Ihrem gültigen token.
In der Praxis, ich würde dieses zusammen mit einer langlebigen refresh-token, so dass ich bekommen kann eine neue Inhaber-token, wenn es abläuft, und wollen auch weiterhin die Interaktion mit der API-Ressourcen, ohne sich erneut authentifizieren zu müssen.
InformationsquelleAutor der Antwort jaeyow
Solange ich weiß, der überbringer token Leben in der client-Seite, also denke ich nicht, dass Sie benötigen einen server-Seite "logout" - Funktion. Entfernen Sie einfach den token vom client lokale Speicherung, melden Sie sich.
InformationsquelleAutor der Antwort Ghidello