如何在 PowerShell 中存储 MFA 凭据

6

在基本认证下,您以前可以将凭据存储在变量中。

$cred = Get-Credential

现在我们正在使用现代身份验证,我们的多因素认证是Duo。

我如何将我的MFA凭据存储到变量中,以便可以将它们插入脚本中?

例子:

$mfacred = *whateverthecodeis*
Connect-MsolService -Credential $mfacred
Connect-AzureAD -Credential $mfacred

编辑 我不想绕过MFA,我想提示用户进行身份认证并以一种方式存储凭据和令牌,以便脚本的其余部分可以使用凭据和令牌。

1个回答

2
关于我在脚本中使用MFA启用的账户的经验,唯一能够绕过MFA的方法是使用没有“-Credential”参数的cmdlet。
MFA的主要用途是保护账户免受以下威胁:运行在被攻击的账户上的脚本。
更新:
因此,有一种方法可以通过编程方式获取令牌。这是通过利用安装Azure模块和/或其他O365模块时附带的ADAL二进制文件完成的。没有简单的方法来提示并将令牌存储在变量中。
您需要在脚本中加载DLL以开始缓存令牌:
Add-Type -Path 'C:\Program Files\WindowsPowerShell\Modules\AzureAD\2.0.x.x\Microsoft.IdentityModel.Clients.ActiveDirectory.dll'

你可以使用 AcquireTokenAsync 方法预先获取访问令牌。
$accesstoken = [Microsoft.IdentityModel.Clients.ActiveDirectory.TokenCache]::DefaultShared
$accesstoken.ReadItems() | select DisplayableId, Authority, ClientId, Resource

上述的ReadItem()方法将给您所有存储令牌所需的信息。

$authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList #PLACE AUTHORITY URL HERE#
$client_id = "CLIENT_ID INFO"
$Credential = Get-Credential YOURUSERNAME@COMPANY.COM
$AzureADCred = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.UserPasswordCredential" -ArgumentList $Credential.UserName,$Credential.Password
$authResult = [Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContextIntegratedAuthExtensions]::AcquireTokenAsync($authContext,"https://RESOURCE-URL.COM",$client_Id,$AzureADCred)

一旦您获得了令牌,就可以使用它连接到您的会话,无论是Exchange Online、Azure还是Office。

$Authorization = "Bearer {0}" -f $authResult.Result.AccessToken
$Password = ConvertTo-SecureString -AsPlainText $Authorization -Force
$Ctoken = New-Object System.Management.Automation.PSCredential -ArgumentList "YourCompanyUserAccount@COMPANY.COM", $Password

需要注意的是,这些只适用于访问令牌,不包括刷新令牌。根据您使用的ADAL二进制文件,您甚至可能无法获取刷新令牌。

如需了解有关访问令牌的更多信息,请在此处进行更多研究。


我不想绕过MFA,我想提示输入并以这样的方式存储凭据和令牌,以便脚本的其余部分可以使用这些凭据和令牌。 - Aaron Martin
@AaronMartin 希望这能帮到你。 - Peter Kay
1
我将不得不尝试操作这个。我们使用Duo,所以希望这会适用。 - Aaron Martin
它应该只基于逻辑工作。你基本上只获取通过Microsoft发行的令牌。无论Duo后端发生了什么(MFA提示和秘密软令牌),都会在访问令牌发行之前完成。 - Peter Kay
我不确定它是否仍然有效,但以前可以使用应用密码绕过MFA(我曾经在脚本中使用过这种方法)。 - bluuf
1
根据你想要访问的服务不同,我知道O365有应用程序密码,但我不确定其他服务是否也有。 - Peter Kay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接