"Authorization has been denied for this request" 访问部署在 Azure 中的 Web API
"Authorization has been denied for this request" when accessing Web API deployed in Azure
从这个问题开始:
我现在已经成功获得网络应用 运行 这个安全模型:
SPA 应用程序使用 adal.js/adal_angular.js 通过 AAD 进行身份验证。
返回的令牌被传递到在同一台机器上运行的 web api [API1]。
该网站 api 代表用户获取新令牌以访问下游 API [API2].
下游 api 代表用户获取新令牌以访问另一个下游 API [API3].
现在,当我在本地有 [API2] 运行 时,一切正常。
但是,当我将该 Web 应用程序部署到我的 Azure 订阅并尝试调用它时(除了来自 [API1] 的 REST API 调用中的 url 之外没有更改任何其他内容) ,我得到以下信息:
{"Message":"Authorization has been denied for this request."}
似乎没有返回任何其他错误详细信息或在 Fiddler 跟踪中。比较有效调用和无效调用之间的 jwt 令牌有效负载,并没有透露太多信息。除了过期声明和 "aio"(不确定那是什么)之外,它们看起来是一样的。
唯一的变化是部署的网络应用程序的 URL(从 http://localhost:8080/
到 http://mywebappname.azurewebsites.net/)
请注意,Web 应用部署到与应用注册和 [API3] 所在的不同的 AD 租户中,但我认为这无关紧要。
关于我在部署时可能需要更改的内容或如何进一步解决此问题有什么想法吗?
更新:请求适用于 Curl
使用 curl 发出相同的请求有效:
curl -H "Authorization: Bearer ey..." http://mywebapi.azurewebsites.net/api/resource
所以问题似乎是我如何在我的 C# 代码中发出请求?比较 Fiddler 中的 headers,我看不出有什么区别。
这是来自 curl 的 Fiddler trace:
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>
这是我的代码中的 Fiddler 跟踪,但它不起作用:
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",但是对于来自我的代码的失败请求,它们是 "anonymous".
尽管 header 在 Fiddler 跟踪中正确显示,但它必须以某种方式被剥离?这可能吗?
在一个不相关的问题中,我不得不从我的机器上删除所有不受信任的证书(Internet 选项->内容->证书)。
我注意到这样做之后,我的问题就解决了。这是一个很长的证书列表,所以我不知道是哪个(哪些)问题导致了问题,也不知道为什么。
鉴于缺乏回应,这显然是一个非常模糊的问题,但不幸的是我们没有追根究底。如果再出现,我做的时候可以更有条理一些。
从这个问题开始:
我现在已经成功获得网络应用 运行 这个安全模型: SPA 应用程序使用 adal.js/adal_angular.js 通过 AAD 进行身份验证。 返回的令牌被传递到在同一台机器上运行的 web api [API1]。 该网站 api 代表用户获取新令牌以访问下游 API [API2].
下游 api 代表用户获取新令牌以访问另一个下游 API [API3].
现在,当我在本地有 [API2] 运行 时,一切正常。
但是,当我将该 Web 应用程序部署到我的 Azure 订阅并尝试调用它时(除了来自 [API1] 的 REST API 调用中的 url 之外没有更改任何其他内容) ,我得到以下信息:
{"Message":"Authorization has been denied for this request."}
似乎没有返回任何其他错误详细信息或在 Fiddler 跟踪中。比较有效调用和无效调用之间的 jwt 令牌有效负载,并没有透露太多信息。除了过期声明和 "aio"(不确定那是什么)之外,它们看起来是一样的。
唯一的变化是部署的网络应用程序的 URL(从 http://localhost:8080/
到 http://mywebappname.azurewebsites.net/)
请注意,Web 应用部署到与应用注册和 [API3] 所在的不同的 AD 租户中,但我认为这无关紧要。
关于我在部署时可能需要更改的内容或如何进一步解决此问题有什么想法吗?
更新:请求适用于 Curl
使用 curl 发出相同的请求有效:
curl -H "Authorization: Bearer ey..." http://mywebapi.azurewebsites.net/api/resource
所以问题似乎是我如何在我的 C# 代码中发出请求?比较 Fiddler 中的 headers,我看不出有什么区别。 这是来自 curl 的 Fiddler trace:
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>
这是我的代码中的 Fiddler 跟踪,但它不起作用:
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",但是对于来自我的代码的失败请求,它们是 "anonymous". 尽管 header 在 Fiddler 跟踪中正确显示,但它必须以某种方式被剥离?这可能吗?
在一个不相关的问题中,我不得不从我的机器上删除所有不受信任的证书(Internet 选项->内容->证书)。
我注意到这样做之后,我的问题就解决了。这是一个很长的证书列表,所以我不知道是哪个(哪些)问题导致了问题,也不知道为什么。
鉴于缺乏回应,这显然是一个非常模糊的问题,但不幸的是我们没有追根究底。如果再出现,我做的时候可以更有条理一些。