• 【Azure 应用服务】Azure Function 启用 Managed Identity后, Powershell Funciton出现 ERROR: ManagedIdentityCredential authentication failed


    问题描述

    编写Powershell Function,登录到China Azure并获取Azure AD User信息,但是发现遇见了 [Error] ERROR: ManagedIdentityCredential authentication failed: An unexpected error occured while fetching the AAD Token. Please contact support with this provided Correlation IdStatus: 500 (Internal Server Error) 。

    问题分析

    分析错误原因,这是因为Powershell登录时候出现错误,考虑到目前是登录到中国区Azure,所以使用 Connect-AzAccount 登录时,想要指定 -Environment 为 AzureChinaCloud。

    而 PowerShell Function App 自动在根目录下添加 profile.ps1 文件, 默认文件内容为:

    # Azure Functions profile.ps1
    #
    # This profile.ps1 will get executed every "cold start" of your Function App.
    # "cold start" occurs when:
    #
    # * A Function App starts up for the very first time
    # * A Function App starts up after being de-allocated due to inactivity
    #
    # You can define helper functions, run commands, or specify environment variables
    # NOTE: any variables defined that are not environment variables will get reset after the first execution
    
    # Authenticate with Azure PowerShell using MSI.
    # Remove this if you are not planning on using MSI or Azure PowerShell.
    if ($env:MSI_SECRET) {
        Disable-AzContextAutosave -Scope Process | Out-Null
        Connect-AzAccount -Identity
    }
    
    # Uncomment the next line to enable legacy AzureRm alias in Azure PowerShell.
    # Enable-AzureRmAlias
    
    # You can also define functions or aliases that can be referenced in any of your PowerShell functions.

    可见,默认的 Connect-AzAccount -Identity中并没有指定 Environment, 所以Function在运行时,会默认连接到Global Azure,所以就会出现 ManagedIdentityCredential authentication failed。

    PS: 如果没有启用Managed Identity,则$env:MSI_SECRET为False,不会执行profile.ps1中的代码。

    解决方案

    在Function App页面中,点击App Service Editor, 修改 profile.ps1 文件。

    使用

    Connect-AzAccount -Environment AzureChinaCloud -Identity

    代替

    Connect-AzAccount  -Identity

    操作截图如下:

    修改后,回到Function --> Code + Test 页面,测试问题消失。

    using namespace System.Net
    
    # Input bindings are passed in via param block.
    param($Request, $TriggerMetadata)
    
    # Write to the Azure Functions log stream.
    Write-Host "PowerShell HTTP trigger function processed a request."
    Write-Host $env:MSI_SECRET
    # Interact with query parameters or the body of the request.
    $name = $Request.Query.Name
    if (-not $name) {
        $name = $Request.Body.Name
    }
    
    $body = "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
    
    if ($name) {
        $body = "Hello, $name. This HTTP triggered function executed successfully."
    }
    #login in to azure china 
    Connect-AzAccount -Environment AzureChinaCloud -identity
    # get User information
    Get-AzADUser -First 2 -Select 'City' -AppendSelected
    
    # Associate values to output bindings by calling 'Push-OutputBinding'.
    Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
        StatusCode = [HttpStatusCode]::OK
        Body = $body
    })

    注:为了是的Connect-AzAccount成功运行,需要在requirements.psd1中添加 'Az' = '7.*' ,使得Function App的实例安装好Az模块。当然,如果Function中需要其他的Powershell模块,在这里添加即可。

    # This file enables modules to be automatically managed by the Functions service.
    # See https://aka.ms/functionsmanageddependency for additional information.
    #
    @{
        # For latest supported version, go to 'https://www.powershellgallery.com/packages/Az'. 
        # To use the Az module in your function app, please uncomment the line below.
        'Az' = '7.*'
    }

    附录一:在中国区Function App中如果没有指定Environment的其他异常有

    异常一:anagedIdentityException: Exception thrown when retrieving a token using ADAL library 

    Microsoft.Azure.AppService.ManagedIdentity.ManagedIdentityException: Exception thrown when retrieving a token using ADAL library --->
    Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException: AADSTS500011: The resource principal named 
    https://management.core.windows.net/ was not found in the tenant named GSKChina. This can happen if the application has not been installed by the
    administrator of the tenant or consented to by any user in the tenant. You might have sent your authentication request to the wrong tenant. Trace 
    ID: cdc5ba6d-851a-45f1-a29f-20e608af0700 Correlation ID: af280748-d9f0-4d02-9ce3-ac74dffe0d23 Timestamp: 2022-04-19 09:50:50Z ---> 
    System.Net.Http.HttpRequestException: Response status code does not indicate success: 400 (BadRequest). ---> 
    Microsoft.IdentityModel.Clients.ActiveDirectory.AdalException: {"error":"invalid_resource","error_description":"AADSTS500011: The resource 
    principal named https://management.core.windows.net/ was not found in the tenant named GSKChina. This can happen if the application has not been 
    installed by the administrator of the tenant or consented to by any user in the tenant. You might have sent your authentication request to the 
    wrong tenant.\r\n
    Trace ID: cdc5ba6d-851a-45f1-a29f-20e608af0700\r\n
    Correlation ID: af280748-d9f0-4d02-9ce3-ac74dffe0d23\r\n
    Timestamp: 2022-04-19 09:50:50Z",
    "error_codes":[500011],
    "timestamp":"2022-04-19 09:50:50Z",
    "trace_id":"cdc5ba6d-851a-45f1-a29f-20e608af0700",
    "correlation_id":"af280748-d9f0-4d02-9ce3-ac74dffe0d23",
    "error_uri":"https://login.partner.microsoftonline.cn/error?code=500011"}: 
    Unknown error --- End of inner exception stack trace --- 
    --- End of inner exception stack trace 
    --- at Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.Http.AdalHttpClient.d__22`1.MoveNext() 
    --- End of stack trace from previous location where exception was thrown 
    --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.Http.AdalHttpClient.d__21`1.MoveNext() 
    --- End of stack trace from previous location where exception was thrown 
    --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.Flows.AcquireTokenHandlerBase.d__72.MoveNext() 
    --- End of stack trace from previous location where exception was thrown 
    --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.Flows.AcquireTokenHandlerBase.d__69.MoveNext() 
    --- End of stack trace from previous location where exception was thrown 
    --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.Flows.AcquireTokenHandlerBase.d__59.MoveNext() 
    --- End of stack trace from previous location where exception was thrown 
    --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.Flows.AcquireTokenHandlerBase.d__57.MoveNext() 
    --- End of stack trace from previous location where exception was thrown 
    --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext.d__33.MoveNext() 
    --- End of stack trace from previous location where exception was thrown 
    --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext.d__58.MoveNext() 
    --- End of stack trace from previous location where exception was thrown 
    --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Azure.AppService.ManagedIdentity.Clients.AdalClient.d__2.MoveNext() 
    --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Azure.AppService.ManagedIdentity.Clients.AdalClient.d__0.MoveNext() 
    --- End of inner exception stack trace 
    --- at Microsoft.Azure.AppService.ManagedIdentity.Clients.AdalClient.d__0.MoveNext() 
    --- End of stack trace from previous location where exception was thrown 
    --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Azure.AppService.ManagedIdentity.AadProvider.d__11.MoveNext() 
    --- End of stack trace from previous location where exception was thrown 
    --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at
     Microsoft.Azure.AppService.ManagedIdentity.AadProvider.GetAuthToken(String tenantId, String clientId, String secretUrl, String resource, X509Certificate2 cert, IManagedIdentityLogger logger, Boolean bypassCache, String authenticationEndpoint) at
     Microsoft.Azure.AppService.TokenService.Controllers.TokenRequestServer.GetTokenV10(ITokenServiceHttpRequest tokenRequest)

    异常二:ManagedIdentityCredential authentication failed: An unexpected error occured while fetching the AAD Token.

    2022-04-19T15:05:56.059 [Warning] WARNING: Unable to acquire token for tenant 'organizations' with error 'ManagedIdentityCredential authentication failed: 
    An unexpected error occured while fetching the AAD Token. Please contact support with this provided Correlation Id
    Status: 500 (Internal Server Error)Headers:Date: Tue, 19 Apr 2022 15:05:55 GMTContent-Length: 200
    See the troubleshooting guide for more information. https://aka.ms/azsdk/net/identity/managedidentitycredential/troubleshoot' 2022-04-19T15:05:56.847 [Error] ERROR: ManagedIdentityCredential authentication failed:
    An unexpected error occured while fetching the AAD Token. Please contact support with this provided Correlation Id
    Status: 500 (Internal Server Error)Headers:Date: Tue, 19 Apr 2022 15:05:55 GMTContent-Length: 200
    See the troubleshooting guide for more information. https://aka.ms/azsdk/net/identity/managedidentitycredential/troubleshootException

    附录三:Connect-AzureAD -AzureEnvironmentName AzureChinaCloud 

     Source: https://docs.microsoft.com/en-us/powershell/module/azuread/connect-azuread?view=azureadps-2.0

    参考资料

    Get-AzADUser : https://docs.microsoft.com/en-us/powershell/module/az.resources/get-azaduser?view=azps-7.4.0

  • 相关阅读:
    Android Studio 中关于NDK编译及jni header生成的问题
    为YAESU FT-817ND 增加频谱功能
    Nagios 安装配置
    ubuntu 13.10 Ralink RT3290 无线与蓝牙4.0的驱动安装
    golang全文搜索--使用sphinx
    GNU Radio 之 rtl-sdr
    OsmocomBB && Motorora C118
    OsmocomBB 编译安装
    Go 若干技巧
    Docker内核知识
  • 原文地址:https://www.cnblogs.com/lulight/p/16175869.html
Copyright © 2020-2023  润新知