2013-05-21 7 views
5

Wie würde ich das folgende Szenario mit ServiceStack implementieren?Token-basierte Authentifizierung mit ServiceStack durchführen

Anfängliche Anfrage wird an http://localhost/auth ein Autorisierungs-Header wie folgt definiert sind:

Authorization: Basic skdjflsdkfj=

Die IAuthProvider Implementierung validiert gegen einen Benutzerspeicher und gibt eine Session-Token als Antwort Körper (JSON).

Der Client verwendet dieses Token ein sendet sie gegen die nachfolgenden Anforderungen wie http://localhost/json/reply/orders den Authorization-Header wie folgt aus:

Authorization: BasicToken <TokenFromPreviousSuccessfulLogin>

ein AuthenticateAttribute Mit I-Flag meinen Dienst wollen Authentifizierung zu verwenden.

Wie soll ich die Validierung des Tokens für die nachfolgenden Anfragen implementieren? Wie soll ich das IAuthProvider implementieren, um das Token bereitzustellen? Wie würde ich die Provider etc. registrieren? Verwenden Sie RequestFilters oder verwenden Sie die AuthFeature?

Antwort

7

ServiceStacks JWT AuthProvider und API Key AuthProvider verwenden beide tokenbasierte Authentifizierung.

Ansonsten ist die BasicAuth Provider ist eine sehr einfache Klasse, die einfach extrahiert den Benutzernamen und Passwort aus dem BasicAuth Kopf- und wertet sie aus:

public override object Authenticate(...) 
{ 
    var httpReq = authService.RequestContext.Get<IHttpRequest>(); 
    var basicAuth = httpReq.GetBasicAuthUserAndPassword(); 
    if (basicAuth == null) 
     throw HttpError.Unauthorized("Invalid BasicAuth credentials"); 

    var userName = basicAuth.Value.Key; 
    var password = basicAuth.Value.Value; 

    return Authenticate(authService, session, userName, password, request.Continue); 
} 

Wenn Sie verbesserte Verhalten zur Verfügung stellen möchten, würde ich einfach diese Klasse erben Check für die Authorization: BasicToken Kopfzeile, wenn es existiert verwenden Sie andernfalls die base.Authenticate(...) Methode, um die anfängliche Validierung durchzuführen.

+0

Vielen Dank für Ihre Antwort. Die Frage war auf die hier beschriebenen Szenarien ausgerichtet (http://stackoverflow.com/questions/16690758/alternative-to-cookie-based-session-authentication). –

+0

@mythz Ich habe versucht, genau dies zu tun, aber Sie können nicht den Provider-Namen oder Realm auf der Basisklasse festlegen, weil der BasicAuthProvider Sie nicht im Konstruktor festlegen können. – Junto

+0

@Junto was meinst du damit [lässt dich nicht im Konstruktor setzen] (https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack/Auth/BasicAuthProvider.cs#L14) ? – mythz

Verwandte Themen