我正在构建一个与SQL MI交互的powershell脚本
有许多方法可以做到这一点。出于各种原因,我选择了这里描述的。net框架:
https://www.sqlshack.com/connecting-powershell-to-sql-server/
为了进行身份验证,我使用az account get-access-token
获得令牌这个可以工作,但是让我担心的是它没有提示任何东西,包括MFA。
这是如何授予我访问数据库而不经过MFA?
复制以下代码:
$SqlConn = New-Object System.Data.SqlClient.SqlConnection
$SqlConn.ConnectionString="Server=$DBServer;Encrypt=True;TrustServerCertificate=True;Connection Timeout=10;ApplicationIntent=ReadOnly;"
# note this finishes executing without prompting for anything and returns a valid token
SqlConn.AccessToken=$(az account get-access-token --tenant $tenant --resource https://database.windows.net --query accessToken -o tsv)
SqlConn.Open()
然后我有一些代码在数据库中运行各种选择,包括suser_sname()
,这显示了我的AAD登录
但是我从来没有被提示输入密码或通过MFA
我如何获得访问SQL MI数据不通过MFA?
为了排除某种登录缓存,我是;
- 完全退出并处于RDP会话
- 运行https://login.microsoftonline.com/common/oauth2/v2.0/logout完全注销
az login --tenant $tenant
提示登录+MFA(Get-AzContext).TokenCache.ReadItems()
给出你不能在一个空值表达式上调用方法- 通过此方法登录后,登录SSMS,提示login+MFA
所以我不认为这是在使用现有的缓存登录
这似乎是一个SSO情况或与资源有关的事情,但为什么限制到Azure SQL资源不需要MFA或pwd?
使用缓存的刷新令牌来获取令牌。只要刷新令牌有效,就不需要MFA或密码。
这个答案提到了缓存存储的位置:https://stackoverflow.com/a/69011720/1658906.
此缓存与SSMS或浏览器使用的缓存是分开的,因此注销/登录时会有不同的状态。
Get-AzContext不会返回这个,因为据我所知,它也使用了不同的缓存。
在这里发布更详细的代码答案
下面是一些Powershell代码
- 如果存在,使用缓存的Azure cli令牌登录到Azure SQL数据库
- 如果没有缓存令牌,提示登录
- 你可以使用。net对象做你所有好的SQL的东西
$SqlConn = New-Object System.Data.SqlClient.SqlConnection
$SqlConn.ConnectionString="Server=$DBServer;Encrypt=True;TrustServerCertificate=True;Connection Timeout=10;ApplicationIntent=ReadOnly;"
$jwt=$(az account get-access-token --tenant $tenant --resource https://database.windows.net --query accessToken -o tsv)
if ([string]::IsNullOrWhiteSpace($jwt)) {
az login --tenant $tenant
$jwt=$(az account get-access-token --tenant $tenant --resource https://database.windows.net --query accessToken -o tsv)
}
SqlConn.AccessToken=$jwt
SqlConn.Open()
整个过程非常不一致。
- az cli可以使用缓存令牌90天,不需要登录
- SSMS和Azure Portal总是要求在新的windows会话中登录,也有各种登录超时强加
- 我甚至不能让Azure Data Studio登录,因为它使用了另一组登录过程,这些过程似乎是基于VSCode的,并返回到运行在本地主机上的docker映像。我当前的客户端被锁定了,我们不可能让这个工作