在发出jQuery Ajax请求时,Authorization Header为null

Jai*_*ime 5 javascript c# jquery asp.net-web-api

我已经浏览了几乎所有我能找到的文章并遵循了建议的内容,并且在服务器端处理请求时,Authorization标头为null.

后端是一个ASP.Net MVC Web API,我已经实现了一个过滤器来进行身份验证.我使用Postman尝试了这个并设置了Authorization标头,我已经验证了后端代码的工作原理.

但是,我似乎无法通过jQuery中的ajax调用使其工作.

这是jQuery Ajax请求:

//do an ajax call to the 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);
        }
    });
Run Code Online (Sandbox Code Playgroud)

以下是处理请求的代码片段......

public override void OnAuthorization(HttpActionContext actionContext)
    {
        // in case the user is authorized using forms authentication
        // check the header for basic authentication
        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);
    }
Run Code Online (Sandbox Code Playgroud)

当我检查actionContext.Request.Header时,我可以看到Authorization但它的值为null.

我在这做错了什么?提前致谢.

编辑:我还在web.config文件中包含一些设置,这可能有助于找出导致问题的原因.

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Request-Headers" value="Authorization, Content-Type"/>
    <add name="Access-Control-Allow-Headers" value="Content-Type, Authorization" />
    <add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS" />
  </customHeaders>
</httpProtocol>

<authentication mode="Forms" />
Run Code Online (Sandbox Code Playgroud)

编辑:下面是Raw Http请求

GET /api/EvaluateTableExpression?callback=jQuery21109280835636891425_1403905133542&j??son=%7B%22fdml%22%3A%22HR.Employee%20as%20emp%20%7B%20emp.ID%2C%20emp.FIRSTNAME%2??C%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
Run Code Online (Sandbox Code Playgroud)

编辑:它似乎与做一个跨原始请求有关.当我在ajax调用上注释掉dataType:"jsonp"属性时,我现在可以看到正在设置Authorization标头.现在问题是,如何在期望jsonp结果或执行CORS时设置标头?

nat*_*l88 3

要解决这个问题,你需要这样做

  1. 从 web.config 中删除所有自定义标头
  2. 在您的 Web api 项目中添加此引用:

    系统.Web.Http.Cors

  3. 在WebApiConfig类的Register 方法中添加以下行代码。

    config.EnableCors();

  4. 在您的控制器中添加以下属性

    [EnableCors(起源:“ ”,标头:“ ”,方法:“*”,SupportsCredentials = true)]