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?