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

时间:2014-06-27 17:46:57

标签: c# javascript jquery asp.net-web-api

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

后端是一个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);
        }
    });

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

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);
    }

当我检查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" />

编辑:以下是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

编辑:它似乎与执行跨源请求有关。当我注释掉dataType:&#34; jsonp&#34;在ajax调用上的属性,我现在可以看到正在设置Authorization标头。现在问题是,如何在期望jsonp结果或执行CORS时设置标头?

1 个答案:

答案 0 :(得分:3)

要解决此问题,您需要这样做

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

    System.Web.Http.Cors

  4.   
  5. WebApiConfig 类的注册 方法中添加以下行代码。

      

    config.EnableCors();

  6. 在控制器中添加以下属性

      

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