2013-02-19 16 views
5

Ich schreibe einen Verify Password Service mit der ASP.NET Web API.RESTful Verify Password Service

Der Dienst akzeptiert ein Kennwort für den aktuell angemeldeten Benutzer, überprüft es und gibt einen codierten Wert zurück. Dies alles geschieht über SSL.

Der Aufruf dieser Methode bewirkt keine Änderung des Status.

Zunächst sieht es so aus, als ob es eine GET Anfrage sein sollte, aber bei weiterer Inspektion bin ich besorgt über den Webserver, der Klartextkennwörter protokolliert.

Wir könnten dies als POST implementieren, aber das scheint wie das falsche Verb die Aktion gegeben.

Ist dies einfach ein Fall von Pragmatismus über das Verfahren oder gibt es mehr, was wir tun können, um sowohl die pragmatischen als auch die RESTful-Fälle zu erfüllen?

Antwort

1

Sie sollten Basic Authentication verwenden, wo Sie den Benutzernamen/das Passwort als Header übergeben. Dies passt auch besser als der bereits definierte Standard.

Es gibt bereits einen javascript Code für die Base64-Codierung - wenn Sie dies im Browser tun müssen.


Wenn Sie dies tun zu authentifizieren und der codierte Wert ist der Zugriffstoken (Cookie), ist es besser OAuth 2.0 zu verwenden.

+0

Danke Aliostad. Wenn wir uns die Basic Auth-Details ansehen, ist es nicht ganz das, was wir brauchen (insbesondere die Liste der Nachteile). Wir signieren den Benutzer nicht wirklich. Wir überprüfen lediglich, ob der aktuell angemeldete Benutzer sein eigenes Passwort kennt (eine Passwortsperre beim Ändern einiger Einstellungen). –

0

Wenn der API-Aufruf eine Antwort sendet, die keine Ressource an sich ist (keine Ressource, die von einem Datenspeicher zurückgegeben wird), sollten Sie Verben und keine Substantive verwenden.

Sie können einen UserPasswordsController Controller haben, die eine Aktion Methode wie folgt belichtet:

[HttpPost()] 
public HttpResponseMessage Validate() 
{ 
    if (!this.Request.Content.IsFormUrlEncodedContent()) 
    { 
     return this.Request.CreateErrorResponse(
      HttpStatusCode.BadRequest, 
      "Body of request must be form URL encoded." 
     ); 
    } 

    var parameters = this.Request.Content.ReadAsFormDataAsync().Result; 

    var userName = parameters["userName"]; 
    var password = parameters["password"]; 

    // TODO: Validate user name and password 
    var isValid = true; 

    if(!isValid) 
    { 
     return this.Request.CreateErrorResponse(
      HttpStatusCode.Forbidden, 
      String.Format(null, "The password provided for {0} is not valid.", userName) 
     ); 
    } 

    return this.Request.CreateResponse(HttpStatusCode.OK); 
} 

und haben eine registrierte Route wie folgt aus:

routes.MapHttpRoute(
    name:   "UserPasswords", 
    routeTemplate: "api/v1/validate", 
    defaults:  new { controller = "userpasswords" } 
); 

Sie Formulardaten an die Validierung Endpunkt POST würde, dass enthält den Benutzernamen und das Passwort, die Sie validieren möchten. Ein Status des Verboten-Status zeigt an, dass das Passwort ungültig ist, während ein Status von OK zurückgegeben wird, wenn das Passwort gültig ist.

Wenn Sie neu an REST-Schnittstellen arbeiten und einen pragmatischen Ansatz verfolgen möchten, empfehle ich Ihnen einen Blick auf Web API Design - Crafting Interfaces that Developers Love.