【问题标题】:I am getting Azure REST API 403 forbidden error我收到 Azure REST API 403 禁止错误
【发布时间】:2019-09-17 07:17:46
【问题描述】:

我必须通过 azure 功能按指定的时间表重新启动云服务实例。 为此,我使用 Azure 资源管理器 API。为此,我收到 403 错误。 1.我在Azure AD中创建了APP注册。 2.赋予它贡献者的角色。 3.在需要的地方使用了应用程序客户端ID、客户端密码、租户。 下面是代码:

private static async Task<string> GetAccessToken(string tenantName, string clientId, string clientSecret)
    {
        var authString = "https://login.microsoftonline.com/" + tenantName;
        var resourceUrl = "https://management.core.windows.net/";
        var authenticationContext = new AuthenticationContext(authString, false);
        var clientCred = new ClientCredential(clientId, clientSecret);
        var authenticationResult = await authenticationContext.AcquireTokenAsync(resourceUrl, clientCred);
        var token = authenticationResult.AccessToken;
        return token; 
    }

    [FunctionName("RestartWorkerJob")]
    public static void Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, TraceWriter log)
    {
        var tenantName = "";
        var clientId = "";
        var clientSecret = "";

        var token = GetAccessToken(tenantName, clientId, clientSecret).Result;

        string url = "https://management.core.windows.net/{subscription_id}/services/hostedservices/testworkerrole/deployments/{deployment_name}/roleinstances/WorkerRole1_IN_0";

        var client = new HttpClient();
        var request = new HttpRequestMessage()
        {
            RequestUri = new Uri(url),
            Method = HttpMethod.Post
        };

        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
        client.DefaultRequestHeaders.Add("x-ms-version", DateTime.UtcNow.ToShortDateString());
        client.DefaultRequestHeaders.Add(HttpRequestHeader.ContentLength.ToString(), "0");
        try
        {
            var task = client.SendAsync(request).ContinueWith((taskwithmsg) =>
            {
                var response = taskwithmsg.Result;

                var Text = response.Content.ReadAsStringAsync();

                if (response.IsSuccessStatusCode)
                {
                    log.Trace(new TraceEvent(System.Diagnostics.TraceLevel.Info, "Restart was successful"));
                }
                else
                {
                    log.Trace(new TraceEvent(System.Diagnostics.TraceLevel.Error, "Restart was unsuccessful"));
                }
            });
        }
        catch (Exception ex)
        {
            log.Trace(new TraceEvent(System.Diagnostics.TraceLevel.Error, ex.Message));
        }}

使用这种方法会给我错误 403-forbidden。 服务器未能对请求进行身份验证。验证证书是否有效并且与此订阅相关联。

我不明白这里出了什么问题。

【问题讨论】:

  • 这段代码在本地工作吗?您能否确认您获得的令牌是有效的,或者尝试在 curl 或 Postman 请求中自己使用它来验证令牌是否有效?
  • 令牌似乎是有效的,因为它给了我 403 禁止,当令牌无效时它给 401 未经授权。这是我检查过的。

标签: azure azure-active-directory azure-functions


【解决方案1】:

错误 403 可能是权限问题或 SPN 过期。

当您使用 azure ad 注册您的网络应用时,对于 API 权限,请选择 Azure Service Management。选择Delegated permissionsuser_impersonation

请参阅此article 以使用资源管理器身份验证 API。

【讨论】:

  • link 获得访问令牌后是否需要授权,如我的代码所示?当我尝试在邮递员中使用授权端点时,它会返回我的天蓝色登录页面的 html。我是 azure 新手,不确定流程。
  • 在您的代码中,添加带有 Authorization 标头的不记名令牌即可授权。在邮递员中,将您的令牌添加到Authorization,如果令牌正确,您就可以了。正如您的描述,它显示您的登录页面,这意味着您需要添加您的凭据,所以只需在邮递员中添加令牌。
  • 如果对您有帮助,您可以将其标记为答案以关闭此问题。
猜你喜欢
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 2015-02-12
相关资源
最近更新 更多