Ich habe praktisch alle Artikel durchgegangen, die ich finden konnte, und habe befolgt, was vorgeschlagen wurde, und irgendwie ist beim Verarbeiten der Anforderung auf der Serverseite der Autorisierungsheader null.
Das Backend ist eine ASP.Net MVC Web-API und ich habe einen Filter implementiert, um die Authentifizierung durchzuführen. Ich habe dies mit Postman ausprobiert und den Autorisierungsheader eingerichtet und überprüft, dass der Backend-Code funktioniert.
Ich kann es jedoch anscheinend nicht über einen Ajax-Aufruf in jQuery zum Laufen bringen.
Hier ist die jQuery Ajax-Anforderung:
// mache einen Ajax-Aufruf an die API
$.ajax({
url: "http://localhost:55602/api/EvaluateTableExpression?callback=?",
type: "GET",
data: "json=" + escape(JSON.stringify({
"fdml": "HR.Employee as emp { emp.ID, emp.FIRSTNAME, emp.PRSNAME }"
})),
dataType: "jsonp",
beforeSend: function(request) {
request.setRequestHeader("Authorization", "Basic " + btoa("master:servant"));
},
success: function(data, status) {
console.log(data);
if (!data.ErrorsOccurred) {
var header = data.Value.Header.Columns;
var records = processRecords(header, data.Value.Rows.Rows);
renderGrid(header, records, $("#employeeGrid"));
}
},
error: function(xhr, textStatus, errorThrown){
console.log(errorThrown);
}
});
Und hier ist ein Ausschnitt des Codes, der die Anforderung verarbeitet...
public override void OnAuthorization(HttpActionContext actionContext)
{
// für den Fall, dass der Benutzer über Formularauthentifizierung autorisiert ist
// überprüfe den Header auf Basisauthentifizierung
if (Thread.CurrentPrincipal.Identity.IsAuthenticated) return;
var authHeader = actionContext.Request.Headers.Authorization;
if (authHeader != null)
{
if (authHeader.Scheme.Equals("basic", StringComparison.OrdinalIgnoreCase) &&
!String.IsNullOrWhiteSpace(authHeader.Parameter))
if (AuthenticateUser(authHeader)) return;
}
HandleUnauthorizedRequest(actionContext);
}
Wenn ich actionContext.Request.Header inspiziere, sehe ich Authorization, aber sein Wert ist null.
Was mache ich hier falsch? Vielen Dank im Voraus.
EDIT: Ich füge auch einige Einstellungen in der web.config-Datei hinzu, die helfen könnten, das Problem zu finden.
EDIT: Hier ist die Raw Http-Anforderung
GET /api/EvaluateTableExpression?callback=jQuery21109280835636891425_1403905133542&json=%7B%22fdml%22%3A%22HR.Employee%20as%20emp%20%7B%20emp.ID%2C%20emp.FIRSTNAME%2C%20emp.PRSNAME%20%7D%22%7D&_=1403905133544
HTTP/1.1 Host: localhost:55602
Connection: keep-alive
Accept: / User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
Referer: localhost/FDMWeb Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8
EDIT: Es scheint, dass es etwas mit einer Cross-Origin-Anforderung zu tun hat. Wenn ich das attribut dataType: "jsonp" im Ajax-Aufruf auskommentiere, kann ich jetzt sehen, dass der Autorisierungsheader gesetzt wird. Jetzt ist das Problem, wie setze ich den Header, wenn ein jsonp-Ergebnis erwartet wird oder CORS aktiviert ist?