访问部署在 Azure 中的 Web API 时"Authorization has been denied for this request"



继这个问题之后: AADSTS50013:断言受众声明与所需值不匹配

现在,我已成功使用此安全模型运行 Web 应用程序: 使用 adal.js/adal_angular.js 通过 AAD 进行身份验证的 SPA 应用程序。 返回的令牌将传递到在同一台计算机上运行的 Web API [API1]。 该 Web API 代表用户获取新令牌以访问下游 API [API2]。

下游 API 代表用户获取新令牌,以访问另一个下游 API [API3]。

现在,当我在本地运行 [API2] 时,这一切都在工作。
但是,当我将该 Web 应用部署到我的 Azure 订阅并尝试调用它时(除了从 [API1] 进行的 REST API 调用中的 url 之外,不更改任何其他内容),我得到以下结果:

{"Message":"Authorization has been denied for this request."}

似乎没有返回任何其他错误详细信息或在 Fiddler 跟踪中。 在有效的调用和无效的调用之间比较 jwt 令牌有效负载并没有透露太多信息。 除了到期声明和"aio"(不确定那是什么)之外,它们看起来相同。

唯一的更改是已部署 Web 应用的 URL(从http://localhost:8080/到 http://mywebappname.azurewebsites.net/)

请注意,Web 应用部署到与应用注册和 [API3] 所在的 AD 租户不同的 AD 租户中,但我认为这无关紧要。

关于部署时可能需要更改的内容或如何进一步解决此问题的任何想法?

更新:请求适用于 Curl

使用 curl 发出相同的请求是有效的:

curl -H "Authorization: Bearer ey..." http://mywebapi.azurewebsites.net/api/resource

所以问题似乎是我如何在 C# 代码中发出请求? 比较 Fiddler 中的标题,我看不出有任何区别。 这是来自卷曲的小提琴手跟踪,它正在工作:

GET http://mywebapi.azurewebsites.net/api/resource HTTP/1.1
Host: mywebapi.azurewebsites.net
User-Agent: curl/7.46.0
Accept: */*
Connection: Keep-Alive
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJ<snip>

这是我的代码中的提琴手跟踪,它不起作用:

GET http://mywebapi.azurewebsites.net/api/resource HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJ<snip>
Accept: */*
User-Agent: RestSharp/100.0.0.0
Host: mywebapi.azurewebsites.net
Accept-Encoding: gzip, deflate

下面是来自 C# 的请求:

var restClient = new RestClient(serviceUrl) { Timeout = timeout};
var restRequest = new RestRequest(apiEndpoint, Method.GET);
var bearerToken = $"Bearer {securityToken}";
restRequest.AddParameter("Authorization", bearerToken, ParameterType.HttpHeader);
var response = restClient.Execute(restRequest);

在 Azure 网站日志中,我可以看到成功的 curl 请求的身份验证类型为"JWT",但是对于来自我的代码的失败请求,它们是"匿名的"。 不知何故,尽管标头在 Fiddler 跟踪中正确显示,但它必须被剥离? 这可能吗?

在一个不相关的问题中,我不得不从我的机器中删除所有不受信任的证书(互联网选项->内容->证书)。 我注意到这样做后,我的问题解决了。 这是一个很长的证书列表,所以我不知道是哪个(s)导致了问题,或者为什么。
鉴于缺乏回应,这显然是一个非常晦涩的问题,但不幸的是,我们没有深入了解它。 如果它再次发生,当我这样做时,我可以更有条理。

相关内容

最新更新