Angularjs 无法访问';WWW.authenticate';$http响应中的标头(单位为)

Angularjs 无法访问';WWW.authenticate';$http响应中的标头(单位为),angularjs,authentication,express,cors,Angularjs,Authentication,Express,Cors,尽管我能在Chrome开发工具中看到字符串化的“WWW-Authenticate”头对象,但有人能告诉我为什么我的“WWW-Authenticate”头在响应中为空吗? 在服务器端,我正在执行以下操作来设置我的WWW Authenticate标头以及为CORS设置正确的标头: res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8080'); res.setHeader('Access-Control-Expose-Hea

尽管我能在Chrome开发工具中看到字符串化的“WWW-Authenticate”头对象,但有人能告诉我为什么我的“WWW-Authenticate”头在响应中为空吗?

在服务器端,我正在执行以下操作来设置我的WWW Authenticate标头以及为CORS设置正确的标头:

res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8080');
res.setHeader('Access-Control-Expose-Headers', 'WWW-Authenticate');
res.setHeader('WWW-Authenticate', JSON.stringify({
    "token": "encryptedToken", 
    "message": "encryptedMessage"
}));
我相信我在服务器端正确地设置了头,因为当我查看Chrome开发工具时,我在“响应头”下看到了以下请求

响应标题
访问控制允许源站
访问控制公开标题:WWW-Authenticate
连接:保持活动状态
日期:2015年5月15日星期五13:48:29 GMT
ETag:W/“f7-1470611871”
WWW-Authenticate:{“令牌”:“encryptedToken”,“消息”:“encryptedMessage”}
X-Powered-By:Express

但是,当我试图从响应中访问“WWW-Authenticate”头时,我得到空值

$http.get("http://localhost:4242/days")
.then(function (response) {
    var AuthHeader = response.headers('WWW-Authenticate');
    console.log (AuthHeader); // returns null
})

提前感谢您的帮助

好的。。。所以经过一点尝试和错误,我们已经解决了这个问题。我曾经认为,预挂起的X-to自定义头是一个过时的、不必要的参数,然而,在这种情况下使用的浏览器或者angular本身似乎都在期待它

将标题名称更改为:

WWW-authenticate

解决问题。如果有人能说明这一点,请说

事实上,这里引用了第一个Answare:X-的使用已经被弃用,事实上,头应该是“合理命名”的,没有任何前缀。也许考虑重命名为:

appName-authenticate

或类似的最佳实践

可以将
访问控制公开标头
标头设置为包括
www-authenticate
。此标头将允许客户端(包括Angular)在CORS请求上读取这些响应标头

如果您使用的是ASP.NET Web API,则可以直接在
System.Web.Cors.CorsPolicy.exposedHeaders
参数上设置
exposedHeaders
,也可以向控制器方法添加属性。属性方法在中描述

下面是几个使用ASP.NET Web API的示例

示例:设置
ExposedHeaders
参数

var corsPolicy = new CorsPolicy();
corsPolicy.ExposedHeaders.Add("www-authenticate");

var corsOptions = new CorsOptions
{
    PolicyProvider = new CorsPolicyProvider
    {
        PolicyResolver = context => Task.FromResult(corsPolicy)
    }
};

app.UseCors(corsOptions);
示例:使用属性

[EnableCors(origins: "*", headers: "*", methods: "*", exposedHeaders: "www-authenticate")]
public class TestController : ApiController
{
    // ...
}

如果您正在为API使用不同的框架,那么您需要研究该框架,以了解如何设置
访问控制公开标头
标头。

这不是客户端问题,在COR的情况下,浏览器将不允许此标头,因为它没有收到绿灯(另一个标头)来自服务器,表明它可以向客户端公开

因此,对于使用ASP.NET Core的用户,可以在Startup.cs中公开此标题:

void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    ...
    app.UseCors(x => x.AllowAnyOrigin()
    .AllowAnyMethod()
    .AllowAnyHeader()
    .WithExposedHeaders("WWW-Authenticate"));


尝试记录整个响应objectresponse对象---{data:Array[7],status:200,headers:function,config:object,statusText:“OK”}否,我想访问“WWW-Authenticate”头对象(仍然字符串化),但是response.headers函数始终返回null,即使我可以在开发工具中看到该对象。出于好奇,如果您使用console.log(response.headers())?对象{content type:“application/json;charset=utf-8”},会发生什么。
void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    ...
    app.UseCors(x => x.AllowAnyOrigin()
    .AllowAnyMethod()
    .AllowAnyHeader()
    .WithExposedHeaders("WWW-Authenticate"));
void ConfigureServices(IServiceCollection services)
    ...
    services.AddCors(options =>
    {
        var corsPolicy = new CorsPolicy();
        corsPolicy.Origins.Add("*");
        corsPolicy.Methods.Add("*");
        corsPolicy.Headers.Add("*");
        corsPolicy.ExposedHeaders.Add("WWW-Authenticate");
        options.AddPolicy("CorsPolicy", corsPolicy);
    });

void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    ...
    app.UseCors("CorsPolicy")