我有一个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
上面的代码无需用户干预即可工作。
几天前,客户为用户启用了多重身份验证。 如何使用多因素身份验证保持全自动的登录过程(无用户交互)?
最好的问候。
答案 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
答案 1 :(得分:0)
如果您必须以用户身份登录,则可能有2种可选方法。
您可以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
您可以从自动保存的Azure上下文(通常在C:\Users\<UserName>\.Azure\TokenCache.dat
中)获取刷新令牌。
然后,您可以在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“应用”),并且服务主体支持针对自动化方案(例如,公共/私有密钥对)的更安全的身份验证方法)。
所以,你应该做什么:
确保运行此脚本的计算机安全。有权访问该计算机的任何人都具有与脚本相同的访问量。
创建应用程序身份并将凭据与之关联。
注意:强烈建议您将certificate-based authentication用作服务主体,而不是基于密码。在PowerShell脚本中存储任何秘密都是非常不安全的做法!
为服务主体授予对Azure资源的最低访问权限,以使其能够完成所需的任务。
更新您的脚本以使用应用程序的身份(服务主体)代替用户的身份。比使用用户帐户更简单:
$tenantId = "########-####-####-####-############"
$subscriptionId = "########-####-####-####-############"
$appId = "########-####-####-####-############"
$thumbprint= "##############"
Connect-AzAccount -ServicePrincipal -TenantId $tenantId -ApplicationId $appId -CertificateThumbprint $thumbprint
注意:如果此脚本在Azure的VM上运行,则应该忘记步骤2,而只需启用managed identity和use that。