5 Stimmen

Der Autorisierungsheader ist null, wenn eine jQuery-Ajax-Anfrage gestellt wird.

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?

3voto

natnael88 Punkte 1128

Um dieses Problem zu lösen, müssen Sie Folgendes tun:

  1. Entfernen Sie alle benutzerdefinierten Header aus Ihrer web.config

  2. Fügen Sie diese Referenz Ihrem Web-API-Projekt hinzu:

    System.Web.Http.Cors

    • Fügen Sie die folgende Codezeile innerhalb der Register-Methode der WebApiConfig-Klasse hinzu.

    config.EnableCors();

  3. Fügen Sie das folgende Attribut Ihrem Controller oder Ihren Controllern hinzu

    [EnableCors(origins: "", headers: "", methods: "*", SupportsCredentials = true)]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X