通过Powershell通过MFA以编程方式向AAD进行身份验证

时间:2019-09-03 12:45:30

标签: azure powershell azure-active-directory multi-factor-authentication

我有一个PowerShell脚本,该脚本使用用户的凭据使用命令Connect-AzAccount登录到Azure订阅。

代码如下:

$userPassword='password'
$userName="username"
$tenantId="########-####-####-####-############"
$subscriptionId="########-####-####-####-############"
$azureSecpassword = $userPassword | ConvertTo-SecureString -asPlainText -Force
$azureCredential = New-Object System.Management.Automation.PSCredential($userName, $azureSecpassword)
Connect-AzAccount -Credential $azureCredential -Tenant $tenantId -SubscriptionId $subscriptionId

上面的代码无需用户干预即可工作。

几天前,客户为用户启用了多重身份验证。 如何使用多因素身份验证保持全自动的登录过程(无用户交互)?

最好的问候。

3 个答案:

答案 0 :(得分:0)

这是一个常见问题。不幸的是,答案是否定的。如果该帐户启用了MFA,则可以通过交互式方式登录。

在这种情况下,我们通常选择使用服务主体以非交互方式登录。

$azureAplicationId ="Azure AD Application Id"
$azureTenantId= "Your Tenant Id"
$azurePassword = ConvertTo-SecureString "client secret" -AsPlainText -Force
$psCred = New-Object System.Management.Automation.PSCredential($azureAplicationId , $azurePassword)
Connect-AzAccount -Credential $psCred -TenantId $azureTenantId  -ServicePrincipal 

参考-Sign in with a service principal

答案 1 :(得分:0)

如果您必须以用户身份登录,则可能有2种可选方法。

1。如果您将在本地或特定PC上运行脚本

您可以Persist Azure user credentials。您可以enable auto save或将上下文手动保存到文件,然后在另一个PS会话中使用它。

如果启用了自动保存,则可以直接获得如下上下文:

Get-AzContext

# If you have more than one contexts, you can choose one by specifing the name
Get-AzContext -Name 'CSP Azure (e5b0****-****-****-****-5e5f****4c68) - jack@h****a.onmicrosoft.com'

如果要手动进行操作,请参见以下示例:

# Interactively log for one time
Connect-AzAccount

# Save the context
Save-AzContext -Path D:\ctx.dat

在另一个PS会话中,您可以:

Import-AzContext -Path D:\ctx.dat

2。使用刷新令牌获取令牌,并连接到Azure

您可以从自动保存的Azure上下文(通常在C:\Users\<UserName>\.Azure\TokenCache.dat中)获取刷新令牌。

使用记事本打开dat文件,您将获得刷新令牌: enter image description here

然后,您可以在PowerShell中使用该刷新令牌获取新令牌,并连接到Azure:

Clear-AzContext
$tenantId = "e4c9ab4e-****-****-****-230b****57fb"
$subscriptionId = "e5b0fcfa-****-****-****-5e5f****4c68"
$refreshToken = 'AQABAAAAAAAP0****a lot of characters here*****0A9FWoB8mvDtoWRJHBVO7GJzodLKYmNIAA'
$url = "https://login.microsoftonline.com/" + $tenantId + "/oauth2/token"
$body = "grant_type=refresh_token&refresh_token=" + $refreshToken
$response = Invoke-RestMethod $url -Method POST -Body $body
$AccessToken = $response.access_token

Connect-AzAccount -AccountId "the user id, jack@h****a.onmicrosoft.com" -AccessToken $AccessToken -Tenant $tenantId -SubscriptionId $subscriptionId

答案 2 :(得分:-1)

  

如何通过多因素身份验证保持全自动的登录过程(无需用户交互)?

您无法使用用户帐户执行此操作-这就是多因素身份验证的全部重点。

相反,Azure AD支持使用 service 主体(而不是像您当前正在使用的 user 主体)进行身份验证,并且Azure支持授予对Azure资源的访问权限服务负责人。

MFA要求(和其他条件访问策略)不适用于服务主体(通常称为Azure AD“应用”),并且服务主体支持针对自动化方案(例如,公共/私有密钥对)的更安全的身份验证方法)。

所以,你应该做什么:

  1. 确保运行此脚本的计算机安全。有权访问该计算机的任何人都具有与脚本相同的访问量。

  2. 创建应用程序身份并将凭据与之关联。

      

    注意强烈建议您将certificate-based authentication用作服务主体,而不是基于密码。在PowerShell脚本中存储任何秘密都是非常不安全的做法!

  3. 为服务主体授予对Azure资源的最低访问权限,以使其能够完成所需的任务。

  4. 更新您的脚本以使用应用程序的身份(服务主体)代替用户的身份。比使用用户帐户更简单:

    $tenantId = "########-####-####-####-############"
    
    $subscriptionId = "########-####-####-####-############"
    $appId = "########-####-####-####-############"
    $thumbprint= "##############"
    Connect-AzAccount -ServicePrincipal -TenantId $tenantId -ApplicationId $appId -CertificateThumbprint $thumbprint
    

注意:如果此脚本在Azure的VM上运行,则应该忘记步骤2,而只需启用managed identityuse that