我已经浏览了几乎所有我能找到的文章并遵循了建议的内容,并且在服务器端处理请求时,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&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
编辑:它似乎与执行跨源请求有关。当我注释掉dataType:&#34; jsonp&#34;在ajax调用上的属性,我现在可以看到正在设置Authorization标头。现在问题是,如何在期望jsonp结果或执行CORS时设置标头?
答案 0 :(得分:3)
要解决此问题,您需要这样做
System.Web.Http.Cors
在 WebApiConfig 类的注册 方法中添加以下行代码。
config.EnableCors();
在控制器中添加以下属性
[EnableCors(起源:“”,标题:“”,方法:“*”, SupportsCredentials = true)]