Web API 2, OWIN-Authentifizierung, SignOut meldet sich nicht ab

Ich mache einige Nachforschungen im Hinblick auf die Verwendung von Bearer-Token als Authentifizierungsmechanismus (d. H. AngularJS-Benutzeroberfläche, Authentifizierung über OWIN in einem Web-API-Projekt [2]).

Ich habe die Anmeldung funktioniert, Rolleninformationen und alles, was in Ordnung ist, aber ich kann das Token nicht zum Abmelden bringen.

Meine Startkonfiguration lautet wie folgt:

OAuthOptions = new OAuthAuthorizationServerOptions() {
    TokenEndpointPath = new PathString("/Token"),
    Provider = new ApplicationOAuthProvider(PublicClientId),
    AccessTokenExpireTimeSpan = SESSION_TIMEOUT,
    AllowInsecureHttp = true
};

Und meine Abmeldeaktion ist einfach:

public HttpResponseMessage Logout() {
    var authentication = HttpContext.Current.GetOwinContext().Authentication;
    authentication.SignOut(DefaultAuthenticationTypes.ExternalBearer);

    return new HttpResponseMessage(HttpStatusCode.OK);
}

Ich habe das gesamte Authentifizierungsmaterial der Kürze halber weggelassen, aber um zu bestätigen, dass ich es verwendeExternalBearer beim Einrichten des Tokens.

In meiner Benutzeroberfläche speichere ich das Token im lokalen Speicher (hier handelt es sich nicht um Cookies, was eine bewusste Designentscheidung ist). Also habe ich eineAusloggen Schaltfläche auf meiner Benutzeroberfläche, dieAusloggen Aktion wird getroffen und der Code läuft gut.

Wenn ich jedoch anschließend auf der API eine Aktion drücke, für die eine Autorisierung erforderlich ist, wird die Anforderung weiterhin durchlaufen (d. H. Der Benutzer ist weiterhin authentifiziert, obwohl er dies tutsollte wurden abgemeldet.

Entweder fehlt mir etwas wirklich Offensichtliches (würde nicht das erste Mal sein ;-) oder es passiert etwas grundlegenderes - schließlich pinge ich @leastprivilege, da ich weiß, dass dies ihr Bereich ist.

Jede Hilfe oder Einsicht wäre dankbar.

Ich kann mir nur vorstellen, dass das Token auf der Server- / API-Seite statusfrei ist und daher nicht abgelaufen oder abgemeldet werden kann.

Wenn das der Fall ist, könnte ich entweder:

a) Fügen Sie ein Aktualisierungstoken hinzu, das ein neues Token erstellt, das in der Vergangenheit abläuft. Funktioniert dies überhaupt? - tatsächlich stornieren, würde es ein neues Token ausgeben ... das alte wäre noch gültig

b) Speichern Sie den Inhaber-Token in der Datenbank und überprüfen Sie ihn jedes Mal, indem Sie ihn beim Abmelden entfernen (natürlich gesalzen, gehackt usw.). Dies führt uns jedoch nur wieder zu einem statusbehafteten Server.

c) Ich kann (und werde) das Token aus dem lokalen Speicher entfernen, wenn sich jemand explizit abmeldet. Das Token ist jedoch technisch noch gültig, wennein baddy kann das Token abfangen. Natürlich werden alle oben genannten vorbei seinSSL sowieso, was das hemmen sollteböse Jungs / Mädchen.

d) Vielleicht ist dies der Grund, warum viele Leute den Inhaber-Token in einem Cookie (als Speichermechanismus) speichern. Wenn Sie sich also mindestens abmelden, wird der Cookie bei der nächsten Aktualisierung entfernt.

Tut mir leid, das oben Genannte ist ein bisschen wie eine Gehirn-Müllkippe, nur um Fragen vorzubeugen

Antworten auf die Frage(4)

Ihre Antwort auf die Frage