Wie man ServiceStack-Authentifizierung zu arbeiten? (mit iPhone-clients)

Wir gemietet haben, einen Auftragnehmer, schriftlich eine iPhone-app für uns, und ich fange an, schreiben Sie die back-End-Dienst mit ServiceStack.

Ich habe Mühe mit der Autorisierung im Allgemeinen: welche Art von Genehmigung zu verwenden und wie es zu implementieren.

Ich weiß nicht viel über ServiceStack, HTTP und Autorisierung (noch).. ich habe gelesen,diese, aber ich bin wohl immer noch etwas falsch zu machen.

Werde ich verwenden für Benutzernamen und Kennwörter von einem bestehenden legacy-Datenbank für die Authentifizierung (aber sonst nichts - keine Registrierung neuer Benutzer, keine anderen Berechtigungen. Nur Authentifizierung).

So muss ich schreiben, mein eigener provider.

Ich habe es geschafft, einen funktionierenden CredentialsAuthProvider mit Hilfe von dieses tutorial.

Es funktioniert, wenn ich es testen im browser:

  • nennen Sie meinen service und erhalten Sie einen 401
  • POST zu auth/credentials
  • Anruf mein service wieder und erhalten Sie das richtige Ergebnis

Jedoch bemerkte ich, dass der gleiche workflow funktioniert nicht wenn ich versuche es in Fiddler.

POST auth/credentials funktioniert. Ich POSTE das:

POST http://localhost:52690/auth/credentials?format=json HTTP/1.1
User-Agent: Fiddler
Host: localhost:52690
Content-Length: 74
Content-Type: application/json; charset=utf-8

{
  "UserName": "chspe",
  "Password": "xyz",
  "RememberMe": true
}

...und dieses:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Fri, 14 Jun 2013 13:07:35 GMT
X-AspNet-Version: 4.0.30319
X-Powered-By: ServiceStack/3,949 Win32NT/.NET
Set-Cookie: ss-id=3YUUgfwIeJd7PedFK5Th; path=/; HttpOnly
Set-Cookie: ss-pid=zQJ5Z4Vq7AY+BpVwbttj; expires=Tue, 14-Jun-2033 13:07:35 GMT; path=/; HttpOnly
Set-Cookie: ss-opt=perm; expires=Tue, 14-Jun-2033 13:07:35 GMT; path=/; HttpOnly
Set-Cookie: X-UAId=; expires=Tue, 14-Jun-2033 13:07:35 GMT; path=/; HttpOnly
Cache-Control: private
Content-Type: application/json; charset=utf-8
Content-Length: 75
Connection: Close

{"sessionId":"zQJ5Z4Vq7AY+BpVwbttj","userName":"chspe","responseStatus":{}}

Sieht gut aus für mich.

Aber dann wird der Anruf zu meinem eigentlichen service noch ein 401 zurück:

GET http://localhost:52690/hello/world?format=json HTTP/1.1
User-Agent: Fiddler
Host: localhost:52690
Content-Length: 0
Content-Type: application/json; charset=utf-8

Antwort:

HTTP/1.1 401 Unauthorized
Server: ASP.NET Development Server/10.0.0.0
Date: Fri, 14 Jun 2013 13:07:44 GMT
X-AspNet-Version: 4.0.30319
WWW-Authenticate: credentials realm="/auth/credentials"
X-Powered-By: ServiceStack/3,949 Win32NT/.NET
Cache-Control: private
Content-Length: 0
Connection: Close

(dies ist die HelloService von der ServiceStack.Host.AspNet-Paket, habe ich nur noch die [Authorize] Attribut)

Die tatsächliche Anforderung ist korrekt, da der gleiche Aufruf funktioniert, wenn ich entfernen Sie die [Authorize] Attribut.

Bemerkte ich, dass die CredentialsAuthProvider scheint zu funktionieren mit cookies (es gibt mehrere Set-Cookie: ... Linien in der ersten Antwort).

Erste Frage: Ist die CredentialsAuthProvider auch die richtige Wahl für einen client ist das nicht ein browser?

Offenbar Fiddler ' erkennt nicht die cookies, wie kann ich wissen, ob ein iPhone (oder jedes andere mobile Gerät) würde?

Weiter habe ich versucht, die Standardauthentifizierung zu verwenden, statt.

Hier ist mein BasicAuthProvider:

public class MyBasicAuthProvider : BasicAuthProvider
{
    public override object Authenticate(IServiceBase authService, IAuthSession session, Auth request)
    {
        if (request.UserName == "MyUser")
        {
            return true;
        }
    }
}

Aber da bin ich überfragt - ich weiß gar nicht bekommen, dies funktioniert über den browser.

Wenn ich laden Sie die URL von meinem Dienst im browser ein Fenster öffnet sich und fragt nach Benutzernamen und Passwort an.

Ich geben Sie den korrekten Benutzernamen und drücken Sie die EINGABETASTE und das gleiche Fenster öffnet sich sofort wieder. Und wieder, und wieder...und so weiter, egal wie oft ich die (korrekten) Daten.

Jedoch, ich kann sehen, dass ServiceStack eigentlich verwendet meine MyBasicAuthProvider wenn ich da einen Haltepunkt in Visual Studio, sehe ich, dass es erkennt den Benutzernamen und zurück True.

Zweite Frage: Was mache ich falsch?

Muss ich etwas tun, mehr zu bekommen, funktioniert Basic-Auth mit meiner eigenen Datenbank? Nicht überschreiben Authenticate genug?

Schreibe einen Kommentar