最近几年我一直在使用AWS EC2。现在,我想在用ASP开发的应用程序上启用HTTPS。带有AngularJS前端的NET WEB API。为此,我做了一个CloudFront发行版。它已成功加载了静态文件,并在IIS中托管的EC2上调用了REST API。但是不幸的是,当请求从CloudFront发送到我的来源时,自定义标头的值为 null 。
我已经在CloudFront发行版上完成了以下相关配置。
其他设置包括:
我的应用程序有一个登录页面,不需要 Authorization 。成功登录后,应用程序将设置三个自定义标题。
我的应用程序已成功登录用户,但随后自动将其注销。因此,要检查此问题,我在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确实将标头转发到我的来源,但是具有空值。结果如下:
以下是FireFox开发人员模式,我的前端正在将请求与具有适当值的所有自定义标头一起发送到CloudFront。但是随后,CloudFront将这些标头转发到源头,但将值设为空。
那么,我在做什么错?为什么CloudFront将 null 作为值传递给我的标题。非常感谢您的帮助。非常感谢!
编辑
我试图用Postman来访问API,下面是屏幕截图。
以下显示了我对Login方法的调用,并按预期返回了Auth令牌以及在响应中设置的其他自定义标头。
我从响应中提取了所需的标头,并发送了另一个GET请求,并收到了以下内容。
它抛出403禁止错误。奇怪的是,在浏览器开发人员模式下,它抛出401未经授权的错误,而在邮递员中则是403禁止访问。
任何帮助。谢谢
答案 0 :(得分:1)
设置原始自定义标头将使CloudFront包含在对您的来源的每个请求中,如果已经提供了标头,则将其覆盖。这不是您想要的,这解释了为什么您看到 null 值(您添加了没有值的标头)的原因。
原始自定义标题应仅用于常量值,或者在您明确需要覆盖标题时使用。
根据您的情况,您需要通过在白名单标题部分中输入x-working-branch
和x-working-company
将缓存行为设置中的标题列入白名单并点击添加自定义>> ,如下所示:
(我保留了您的 Authorization 和 Host 标头)
请注意,转发标头会影响缓存:根据标头值创建单独的版本。另请参见Caching Content Based on Request Headers。这意味着Authorization
,Host
,x-working-branch
和x-working-company
的不同组合将导致不同的版本(显然,这是您在这里要避免将相同的内容提供给不同的版本用户)。这对于查询字符串和cookie也有效。
了解CloudFront如何缓存对象真的很重要。文档中最重要的部分是Managing How Long Content Stays in an Edge Cache (Expiration)