【发布时间】:2019-09-13 11:31:19
【问题描述】:
过去几年我一直在使用 AWS EC2。现在我想在我用 ASP 开发的应用程序上启用 HTTPS。 NET WEB API 与 AngularJS 中的前端。为此,我制作了 CloudFront 分发版。它已成功加载静态文件并调用 IIS 中托管的 EC2 上的 REST API。但不幸的是,当请求从 CloudFront 发送到我的源时,自定义标头具有 null 作为值。
我在 CloudFront 分发上做了以下相关配置。
进一步的设置包括:
- 白名单 Cookie:授权、VDName
- 查询字符串转发和缓存:全部转发,基于全部缓存
- 源协议策略:仅 HTTP
- 查看器协议策略:将 HTTP 重定向到 HTTPS
我的应用有一个不需要授权的登录页面。成功登录后,应用会设置三个自定义标题。
- 授权
- x-working-company
- 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 确实将标头转发到我的来源,但值为空。结果如下:
以下是 FireFox 开发人员模式,我的前端向 CloudFront 发送请求,其中包含所有具有适当值的自定义标头。但随后 CloudFront 将这些标头转发到源,但将值设为空。
那么,我做错了什么?为什么 CloudFront 在我的标头中将 null 作为值传递。非常感谢任何帮助。非常感谢!
编辑
我尝试使用 Postman 访问 API,以下是屏幕截图。
以下显示了我对 Login 方法的调用,并且正如预期的那样,它返回了 Auth 令牌,并在响应中设置了其他自定义标头。
我从响应中提取了所需的标头并发送另一个 GET 请求并收到以下内容。
它会抛出 403 禁止错误。奇怪的是,在浏览器开发模式下它会抛出 401 Unauthorized 错误,而在 Postman 中它是 403 Forbidden。
任何帮助。谢谢
【问题讨论】:
标签: amazon-web-services asp.net-web-api amazon-ec2 amazon-cloudfront