2017-01-26 5 views
0

Ich versuche ein benutzerdefiniertes Authentifizierungsschema in meinem OData WCF-Dienst zu implementieren, in dem der Client seine Anmeldeinformationen an den Server sendet und ein Sitzungstoken empfängt, wenn sie authentifiziert sind.Senden von Anmeldeinformationen vom Client an den OData-Dienst

Im OData-Dienst, ich habe eine Login-Methode:

[WebInvoke] 
public void Login() 
{ 
    HttpRequest request = HttpContext.Current.Request; 
    string user, password; 

    user = request.Form["User"]; 
    password = request.Form["Password"]; 
    //... 
} 

, die ich von der Client-Aufruf mit jQuery:

$.ajax({ 
    url: loginUrl, 
    type: 'POST', 
    data: JSON.stringify({ User: loginID(), Password: loginPassword() }), 
    dataType: 'json', 
    contentType: 'application/json; charset=utf-8' 
}); 

Im Browser kann ich sehen, dass User und Password sind im POST-Körper vorhanden.

Stepping durch den OData-Dienst, der Login() Verfahren getroffen wird, aber User und Password sind nicht da - die request.Form völlig leer ist.

Zuerst Suche gefunden this question, sagen, dass der POST-Inhaltstyp auf application/json anstelle von application/x-www-form-urlencoded festgelegt werden muss. Durch diese Änderung konnte das Problem jedoch nicht gelöst werden.

Searching viele gefunden SO Fragen zu OData oder WCF POST-Anfragen leer zu sein, aber ich fand schließlich the MSDN page on WCF service operations, in dem es heißt:

Die Operationsmethode Parameter Eingabe nur akzeptieren kann. Auf Daten, die im Nachrichtentext gesendet werden, kann vom Datendienst nicht zugegriffen werden.

Also entsprechend, eine POST-Anfrage wird nicht funktionieren, egal was. Dies scheint zu bedeuten, dass ich eine GET-Anfrage verwenden muss. Senden Sie das Kennwort jedoch in einer GET-Anforderung isabadidea.

Muss ich "faux" HTTP-Basisauthentifizierung verwenden, wo ich die Anmeldeinformationen in einer Kopfzeile, sondern nur für den Login-Aufruf und nicht bei jeder Anfrage weiterleiten?

Welche andere Möglichkeit bietet es, die Anmeldeinformationen vom Client an den OData-Service zu senden?

Antwort

1

Welche andere Möglichkeit bietet es, die Anmeldeinformationen vom Client an den OData-Service zu senden?

Der richtige Weg besteht darin, die Authentifizierung vom OData-Dienst zu trennen. Grundsätzlich müssen Sie einen Endpunkt für Ihren Dienst erstellen, z./Token basierend auf OAuth, zu dem Sie die Benutzerinformationen in einem Post-Aufruf mit

grant_type=password&username=... &password=... 

und erhalten dann ein Zugriffstoken übergeben, die Sie anschließend in den Kopf Ihrer OData passieren ruft

Authorization: Bearer <access_token> 

Die Der OData-Controller selbst verwaltet die Authentifizierung und Token-Erstellung nicht.

Es gibt eine sehr gute Serie von Tutorials von Taiseer Joudeh, die ich empfehlen zu lesen: http://bitoftech.net/2015/02/16/implement-oauth-json-web-tokens-authentication-in-asp-net-web-api-and-identity-2/

Verwandte Themen