Azure Functions中运行AzureAD模块遇认证错误求助
问题描述
在Azure Functions中运行AzureAD模块时遭遇认证失败,已执行以下操作仍未解决:
- 在
requirements.psd1中更新AzureAD模块 - 重启Function App
- 使用
-UseWindowsPowerShell参数导入模块
使用的代码:
Import-Module AzureAD -UseWindowsPowerShell; $cred = New-Object Management.Automation.PSCredential ($user, $secpasswd); Connect-AzureAD -Credential $cred;
出现的错误信息:
2022-10-08T03:23:21Z [Warning] 警告: 模块AzureAD通过WinPSCompatSession远程会话加载在Windows PowerShell中;请注意此模块命令的所有输入和输出均为反序列化对象。若要将此模块加载到PowerShell中,请使用
Import-Module -SkipEditionCheck语法。
2022-10-08T03:23:23Z [Error] 错误: 发生一个或多个错误。:OriginInfo : localhost
Exception :
Type : System.Management.Automation.RemoteException
SerializedRemoteException : Microsoft.Open.Azure.AD.CommonLibrary.AadAuthenticationFailedException: 发生一个或多个错误。: ---> System.AggregateException: 发生一个或多个错误。 ---> Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException ---> System.Net.Http.HttpRequestException: 响应状态代码未指示成功: 400 (BadRequest)。 ---> Microsoft.IdentityModel.Clients.ActiveDirectory.AdalException: : 未知错误
--- 内部异常堆栈跟踪结束 ---
--- 内部异常堆栈跟踪结束 ---
在 Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.Http.AdalHttpClient.<GetResponseAsync>d__221.MoveNext() --- 从之前位置抛出异常的堆栈跟踪结束 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.Http.AdalHttpClient.<GetResponseAsync>d__211.MoveNext()
--- 从之前位置抛出异常的堆栈跟踪结束 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
在 Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.OAuth2.UserRealmDiscoveryResponse.<CreateByDiscoveryAsync>d__24.MoveNext()
--- 从之前位置抛出异常的堆栈跟踪结束 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
在 Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.Flows.AcquireTokenNonInteractiveHandler.<PreTokenRequestAsync>d__5.MoveNext()
--- 从之前位置抛出异常的堆栈跟踪结束 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
在 Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.Flows.AcquireTokenHandlerBase.<RunAsync>d__57.MoveNext()
--- 从之前位置抛出异常的堆栈跟踪结束 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
在 Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext.<AcquireTokenCommonAsync>d__37.MoveNext()
--- 从之前位置抛出异常的堆栈跟踪结束 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
在 Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContextIntegratedAuthExtensions.<AcquireTokenAsync>d__0.MoveNext()
--- 内部异常堆栈跟踪结束 ---
在 System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
在 Microsoft.Open.Azure.AD.CommonLibrary.UserTokenProvider.DoAcquireToken(AdalConfiguration config, PromptBehavior promptBehavior, String userId, SecureString password) 位置 X:\bt\1218881\repo\src\dev\PowerShell.V2\CommonLibrary\TokenProvider\UserTokenProvider.cs:行号 228
在 Microsoft.Open.Azure.AD.CommonLibrary.UserTokenProvider.SafeAquireToken(AdalConfiguration config, ShowDialog showDialog, String userId, SecureString password, Exception& ex) 位置 X:\bt\1218881\repo\src\dev\PowerShell.V2\CommonLibrary\TokenProvider\UserTokenProvider.cs:行号 152
--- 内部异常堆栈跟踪结束 ---
解决步骤
1. 更换模块导入方式
警告明确提示使用-SkipEditionCheck替代-UseWindowsPowerShell,后者通过兼容会话运行会导致序列化问题,修改导入命令:
Import-Module AzureAD -SkipEditionCheck
2. 替换为推荐的模块
AzureAD模块已被官方弃用,优先使用Microsoft Graph PowerShell模块,它更适配Azure Functions环境,支持非交互式认证。若需临时使用AzureAD相关模块,可尝试AzureADPreview:
- 在
requirements.psd1中添加'AzureADPreview' = 'latest' - 导入命令改为:
Import-Module AzureADPreview -SkipEditionCheck
3. 检查认证参数与权限
- 确认
$user为完整用户主体名称(UPN),格式如user@yourdomain.com - 验证
$secpasswd是否正确转换为SecureString,可通过ConvertTo-SecureString $password -AsPlainText -Force生成 - 确保目标用户未启用MFA(用户名密码认证不支持MFA),且拥有AzureAD的访问权限
- 优先使用服务主体认证替代用户名密码,示例命令:
Connect-AzureAD -TenantId $tenantId -ApplicationId $appId -CertificateThumbprint $thumbprint
4. 配置Function App环境
- 在Function App的应用设置中,将
WEBSITE_LOAD_USER_PROFILE设置为1,确保模块能正确加载用户配置 - 确认Function App运行的PowerShell版本为7.x,与模块版本兼容
5. 排查网络访问
确保Function App所在网络未阻止AzureAD认证所需的端点:
login.microsoftonline.comgraph.windows.net
内容的提问来源于stack exchange,提问作者wfwca

