我使用ajax将令牌存储在请求标头中并将其发送到Rest web api。 这是我发送到web api的请求:
var xhr = new XMLHttpRequest();
$.ajax({
url: 'http://localhost:32253/api/UserDetail/Authenticate',
headers: {
"Authorization-Token": res,
"X-HTTP-Method-Override": "GET"
},
type: 'GET',
async: false,
contentType: "application/json",
dataType: 'json',
success: function (data) {
alert("Success from success callback!");
// ShowData(data);
$('#RId').text(data.RoleId);
$('#RDesc').text(data.RoleDescription);
$('#RName').text(data.RoleName);
},
error: function (xhr, status) {
alert(status);
}
//complete: function (data) {
// alert("Success!from complete function");
// }
});
在服务器端(休息web api),我正在尝试阅读标题
if (Request.Headers.Contains("Authorization-Token"))
{
var token = Request.Headers.GetValues("Authorization-Token").First();
}
但请求中不包含标题" Authorization-Token"。我可以在Access-Control-request-Headers中看到标题名称。我不知道如何阅读它的价值。有人可以帮我吗。我也启用了角色
更新 现在我使用请求对象的标准Authorization标头传递令牌
$.ajax({
url: 'http://localhost:32253/api/UserDetail/Authenticate',
beforeSend: function (xhr) {
xhr.setRequestHeader("Authorization", "Basic " + res);
},
type: 'GET',
async: false,
contentType: "application/json",
dataType: 'json',
authorization: res,
success: function (data) {
alert("Success from success callback!");
// ShowData(data);
$('#RId').text(data.RoleId);
$('#RDesc').text(data.RoleDescription);
$('#RName').text(data.RoleName);
},
error: function (xhr, status) {
alert(status);
}
//complete: function (data) {
// alert("Success!from complete function");
// }
});
但我在请求标头中找不到它。 有关详细信息,请参见图像 Request header
请求日志 这是在服务器端收到的请求
OPTIONS /api/UserDetail/Authenticate HTTP/1.1
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en;q=0.5
Host: localhost:32253
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0
Access-Control-Request-Method: GET
Access-Control-Request-Headers: authorization-token,content-type
Origin: http://localhost:14576
答案 0 :(得分:0)
尝试坚持使用标准标题名称。虽然所有的网络跃点都没有传递这个值,但这可能是有可能的。使用带有承载方案的Authorization标头,因为这是标准的,然后在C#中它也是标准属性。
"Authorization" : "Bearer sometoken"
var header = this.Request.Headers.Authorization;
if(header != null && header.Scheme == "Bearer") { /* do something with header.Value */ }
如果您必须使用非标准标头,请在前面添加X,例如:
"X-Authorization-Token" : "sometoken"
任何代理或路由器都应该允许X-header通过而没有任何问题。
更新
尝试使用beforeSend选项设置标题:
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization-Token', res);
},
答案 1 :(得分:0)
请尝试以下操作:
var xhr = new XMLHttpRequest();
$.ajax({
url: 'http://localhost:32253/api/UserDetail/Authenticate',
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization-Token', res);
xhr.setRequestHeader('X-HTTP-Method-Override', "GET");
},
type: 'GET',
async: false,
contentType: "application/json",
dataType: 'json',
success: function (data) {
alert("Success from success callback!");
// ShowData(data);
$('#RId').text(data.RoleId);
$('#RDesc').text(data.RoleDescription);
$('#RName').text(data.RoleName);
},
error: function (xhr, status) {
alert(status);
}
//complete: function (data) {
// alert("Success!from complete function");
// }
});
<强>更新强> 捕获网络并能够在请求标头中找到令牌。有关详细信息,请参阅图像
在没有完整代码的情况下无法说出任何内容。
答案 2 :(得分:0)
感谢Daniel的建议。正如您在OPTIONS请求中所说的那样。我在OPTIONS请求的响应中设置了Access-Control-Allow-Headers。我在REST Web API的global.asax.cs中添加了以下内容
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost:14576");
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Authorization-Token, X-HTTP-Method-Override");
HttpContext.Current.Response.End();
}
}
客户端请求代码如下:
var xhr = new XMLHttpRequest();
$.ajax({
url: 'http://localhost:32253/api/UserDetail/Authenticate',
beforeSend: function (xhr) {
xhr.setRequestHeader('X-Authorization-Token', res);
xhr.setRequestHeader('X-HTTP-Method-Override', "GET");
},
type: 'GET',
async: false,
dataType: 'json',
success: function (data) {
alert("Success from success callback!");
},
error: function (xhr, status) {
alert(status);
}
});
使用web api代码读取标题:
if (Request.Headers.Contains("X-Authorization-Token"))
{
var token = Request.Headers.GetValues("X-Authorization-Token").First();
}
这很好用。
谢谢你们的时间和建议:)