CloudFront将自定义标头转发到原始但具有空值

时间:2019-04-24 08:21:29

标签: amazon-web-services asp.net-web-api amazon-ec2 amazon-cloudfront

最近几年我一直在使用AWS EC2。现在,我想在用ASP开发的应用程序上启用HTTPS。带有AngularJS前端的NET WEB API。为此,我做了一个CloudFront发行版。它已成功加载了静态文件,并在IIS中托管的EC2上调用了REST API。但是不幸的是,当请求从CloudFront发送到我的来源时,自定义标头的值为 null

我已经在CloudFront发行版上完成了以下相关配置。

以下是我对自定义来源标头的设置。 origin

以下是我对缓存行为的设置。 cache behav

其他设置包括:

  • 将Cookie列入白名单:授权,VDName
  • 查询字符串转发和缓存:全部转发,基于全部的缓存
  • 原始协议策略:仅HTTP
  • 查看器协议策略:将HTTP重定向到HTTPS

我的应用程序有一个登录页面,不需要 Authorization 。成功登录后,应用程序将设置三个自定义标题。

  1. 授权
  2. x-working-company
  3. x-working-branch

我的应用程序已成功登录用户,但随后自动将其注销。因此,要检查此问题,我在Authorization类中编写了以下小代码以检查标头值。

valToUpd.Add("S6", "CHK1");
valToUpd.Add("S7", "Before Null");
valToUpd.Add("S8", request.Headers.Count().ToString());
valToUpd.Add("S9", request.Headers.GetValues("Authorization").Single());
valToUpd.Add("S10", request.Headers.GetValues("x-working-company").Single());
valToUpd.Add("S11", request.Headers.GetValues("x-working-branch").Single());
var toUpdt = "";
if (request.Headers.Any(x => x.Key == "Authorization"))
    toUpdt = "A-";
if (request.Headers.Any(x => x.Key == "x-working-company"))
    toUpdt += "C-";
if (request.Headers.Any(x => x.Key == "x-working-branch"))
    toUpdt += "B-";
var ds = request.Headers.Where(x => x.Key == "x-working-branch").Select(c => c.Value);
toUpdt += " br val = ";
foreach (var item in ds)
{
    foreach (var i in item)
    {
        toUpdt += i + " - ";
    }
}
valToUpd.Add("S12", toUpdt);
usersHelperAdo.Update("Users", whereClause, valToUpd); // Its my DAL method to update values in Users table as per the where clause.

并且正如预期的那样,CloudFront确实将标头转发到我的来源,但是具有空值。结果如下:

Database vals

以下是FireFox开发人员模式,我的前端正在将请求与具有适当值的所有自定义标头一起发送到CloudFront。但是随后,CloudFront将这些标头转发到源头,但将值设为空。

FireFox developer mode

那么,我在做什么错?为什么CloudFront将 null 作为值传递给我的标题。非常感谢您的帮助。非常感谢!

编辑

我试图用Postman来访问API,下面是屏幕截图。

以下显示了我对Login方法的调用,并按预期返回了Auth令牌以及在响应中设置的其他自定义标头。

Postman Login

我从响应中提取了所需的标头,并发送了另一个GET请求,并收到了以下内容。

Postman GET call

它抛出403禁止错误。奇怪的是,在浏览器开发人员模式下,它抛出401未经授权的错误,而在邮递员中则是403禁止访问。

任何帮助。谢谢

1 个答案:

答案 0 :(得分:1)

设置原始自定义标头将使CloudFront包含在对您的来源的每个请求中,如果已经提供了标头,则将其覆盖。这不是您想要的,这解释了为什么您看到 null 值(您添加了没有值的标头)的原因。

原始自定义标题应仅用于常量值,或者在您明确需要覆盖标题时使用。

根据您的情况,您需要通过在白名单标题部分中输入x-working-branchx-working-company缓存行为设置中的标题列入白名单并点击添加自定义>> ,如下所示:

enter image description here

(我保留了您的 Authorization Host 标头)

请注意,转发标头会影响缓存:根据标头值创建单独的版本。另请参见Caching Content Based on Request Headers。这意味着AuthorizationHostx-working-branchx-working-company的不同组合将导致不同的版本(显然,这是您在这里要避免将相同的内容提供给不同的版本用户)。这对于查询字符串和cookie也有效。

了解CloudFront如何缓存对象真的很重要。文档中最重要的部分是Managing How Long Content Stays in an Edge Cache (Expiration)