Azure devops Microsoft.IdentityModel.Clients.ActiveDirectory未加载到Azure DevOps PowerShell发布管道上

Azure devops Microsoft.IdentityModel.Clients.ActiveDirectory未加载到Azure DevOps PowerShell发布管道上,azure-devops,azure-powershell,Azure Devops,Azure Powershell,最近,我在尝试创建ClientCredential和/或ClientAssertion时遇到Azure DevOps PowerShell的一些问题。我有以下代码,它在过去基于以下变量创建ClientCredential: 租户 客户ID(SPN) 密码(SPN密码) $ResourceUrl=”https://database.windows.net/" $AuthorityUrl=”https://login.microsoftonline.com/$($TENATID) $objCli

最近,我在尝试创建ClientCredential和/或ClientAssertion时遇到Azure DevOps PowerShell的一些问题。我有以下代码,它在过去基于以下变量创建ClientCredential:

  • 租户

  • 客户ID(SPN)

  • 密码(SPN密码)

    $ResourceUrl=”https://database.windows.net/"

    $AuthorityUrl=”https://login.microsoftonline.com/$($TENATID)

    $objClientCredential=[Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential]::新建($ClientId,$Password) $objAuthenticationContext=[Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext]::新建($AuthorityUrl) $objAuthenticationResult=$objAuthenticationContext.AcquireTokenAsync($ResourceUrl,$objClientCredential)

  • 但是最近这个代码停止工作了。AzureAD模块似乎没有正确加载。这只发生在Azure DevOps Powershell上,在我的机器上工作正常(我使用的是Powershell 7.1) 到目前为止,我尝试了以下几点:

  • 如上图所示运行代码 **中断时间:**$objClientCredential=[Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential]::新建($ClientId,$Password) 错误:找不到类型[Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential]
  • 在运行代码之前安装AzureAD 安装模块-名称AzureAD-Force 导入模块-名称AzureAD **中断时间:**$objClientCredential=[Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential]::新建($ClientId,$Password) 错误:找不到类型[Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential]
  • 从我的计算机导入dll Microsoft.IdentityModel.Clients.ActiveDirectory.dll 添加类型-路径“.\libraries\Microsoft.IdentityModel.Clients.ActiveDirectory.dll” 不会中断,但不会创建ClientCredential,它返回为null

  • 是否有人遇到过类似问题?您知道我应该如何驱动此问题吗?

    如果您在本地计算机上运行脚本。您可以检查程序集的安装位置并手动导入.dll文件。我在本地计算机上进行了测试。仅导入azureAd模块时效果良好:

    Install-Module AzureAD -Force 
    Import-Module -Name AzureAD
    
    如果您在azure管道中运行脚本。当您在azure powershell任务中使用
    安装模块-Name AzureAD-Force
    安装
    AzureAD
    模块时。您可以从生成日志中看到,AzureAD模块安装在文件夹
    C:\Program Files\WindowsPowerShell\Modules\AzureAD\2.0.2.128

    从日志中,我们可以看到assembly
    Microsoft.IdentityModel.Clients.ActiveDirectory.dll
    不会自动加载

    因此,您可以从模块Azure AD安装文件夹手动加载它:请参阅以下内容:

    Install-Module AzureAD -Force 
    Import-Module -Name AzureAD
    Add-Type -Path "C:\Program Files\WindowsPowerShell\Modules\AzureAD\2.0.2.128\Microsoft.IdentityModel.Clients.ActiveDirectory.dll"
        
    $TenantId= "..."
    
    $ClientID ="..."
    
    $Password = "..."
    $ResourceUrl = "https://database.windows.net/"
    
    $AuthorityUrl = "https://login.microsoftonline.com/$($TenantId)"
    ...
    $objAuthenticationResult = $objAuthenticationContext.AcquireTokenAsync($ResourceUrl, $objClientCredential).Result
    
    见下面的结果


    如果您在本地计算机上运行脚本。您可以检查程序集的安装位置并手动导入.dll文件。我在本地计算机上进行了测试。仅导入azureAd模块时效果良好:

    Install-Module AzureAD -Force 
    Import-Module -Name AzureAD
    
    如果您在azure管道中运行脚本。当您在azure powershell任务中使用
    安装模块-Name AzureAD-Force
    安装
    AzureAD
    模块时。您可以从生成日志中看到,AzureAD模块安装在文件夹
    C:\Program Files\WindowsPowerShell\Modules\AzureAD\2.0.2.128

    从日志中,我们可以看到assembly
    Microsoft.IdentityModel.Clients.ActiveDirectory.dll
    不会自动加载

    因此,您可以从模块Azure AD安装文件夹手动加载它:请参阅以下内容:

    Install-Module AzureAD -Force 
    Import-Module -Name AzureAD
    Add-Type -Path "C:\Program Files\WindowsPowerShell\Modules\AzureAD\2.0.2.128\Microsoft.IdentityModel.Clients.ActiveDirectory.dll"
        
    $TenantId= "..."
    
    $ClientID ="..."
    
    $Password = "..."
    $ResourceUrl = "https://database.windows.net/"
    
    $AuthorityUrl = "https://login.microsoftonline.com/$($TenantId)"
    ...
    $objAuthenticationResult = $objAuthenticationContext.AcquireTokenAsync($ResourceUrl, $objClientCredential).Result
    
    见下面的结果


    您好,我尝试了您的解决方案安装模块AzureAD-Force,导入模块AzureAD Add Type xxxxxx,但得到的结果与从计算机使用dll时的结果相同。该代码在创建ClientCredential时不会引发异常,但会返回null@delucaezequiel我检查了您的代码,发现您使用了异步方法
    AcquireTokenAsync
    。Async方法没有立即返回结果。您需要通过撤消result属性来获取结果。
    $objAuthenticationResult=$objAuthenticationContext.AcquireTokenAsync($ResourceUrl,$ObjClient Redential).Result
    。请参见上面的更新AcquireTokenAsync无法正确执行,因为客户端凭据为空。在$objAuthenticationContext.AcquireTokenAsync($ResourceUrl,$objClientCredential)之后我返回带有$objAuthenticationContext.Result.AccessToken的访问令牌,但正如我所说的,由于null@delucaezequiel您是否检查了$ClientId$密码是否已成功传递给
    new()
    Method?是的,我找到了。它们带有所需的值。我在执行之前在控制台中打印它们,并复制到一个纯文本文件中,以检查是否错误添加了空格。您好,我尝试了您的解决方案安装模块AzureAD-Force,导入模块AzureAD Add Type xxxxxx,但我得到的结果与使用machi中的dll时相同代码不会在ClientCredential创建时引发异常,但会返回null@delucaezequiel我检查了您的代码,发现您使用了async方法
    AcquireTokenAsync
    。async方法没有立即返回结果。您需要通过撤销result属性来获得结果。
    $objAuthenticationResult=$objauthnticationContext.AcquireTokenAsync($ResourceUrl,$objClientCredential)。结果
    。请参阅上面的更新由于客户端凭据为空,AcquireTokenAsync无法正确执行。在$objAuthenticationContext.AcquireTokenAsync($ResourceUrl,$objClientCredential)之后我返回带有$objAuthenticationContext.Result.AccessToken的访问令牌,但正如我所说的,由于null@delucaezequiel您是否检查了$ClientId$密码是否成功