You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

az account获取token无需MFA即可访问SQL MI的原因排查

问题:使用az account get-access-token访问SQL MI无需MFA,但az login仍需验证

我正在编写一个与SQL托管实例(SQL MI)交互的PowerShell脚本,采用.NET框架的SqlConnection进行连接。通过az account get-access-token获取令牌完成认证,全程无需输入密码或MFA就能访问数据库,执行suser_sname()显示的是我的AAD登录账号。

我已经通过注销RDP会话、登出微软账号等操作排除了登录缓存问题,但执行az login --tenant $tenant时仍然需要MFA验证。想搞明白为什么访问SQL MI的时候不需要MFA就能获取权限。

复现代码:

$SqlConn = New-Object System.Data.SqlClient.SqlConnection

$SqlConn.ConnectionString="Server=$DBServer;Encrypt=True;TrustServerCertificate=True;Connection Timeout=10;ApplicationIntent=ReadOnly;"

# 无需任何提示即可返回有效令牌
$SqlConn.AccessToken=$(az account get-access-token --tenant $tenant --resource https://database.windows.net --query accessToken -o tsv)

$SqlConn.Open()

解答

这种情况核心是你的环境中存在非交互式的持久化身份验证上下文,和普通用户登录缓存无关,常见原因有以下几种:

  • 托管身份自动认证
    如果脚本运行在Azure虚拟机、函数App等支持托管身份的资源上,系统会自动为该资源分配托管身份(系统分配或用户分配)。az account get-access-token会优先调用这个身份获取令牌,而托管身份本身属于服务级身份,不需要MFA验证。你可以执行az account show查看输出中的userAssignedIdentities或systemAssignedIdentity字段,确认是否使用了托管身份。

  • 服务主体凭据缓存
    之前可能通过az login --service-principal -u <client-id> -p <secret> --tenant <tenant-id>这类非交互式命令登录过服务主体,这类凭据会持久保存在本地~/.azure目录的配置文件中。即使你注销了用户交互式会话,服务主体的缓存不会被清除,az account get-access-token会自动复用这个身份。执行az account list可以查看所有已缓存的身份,若存在类型为servicePrincipal的条目,就是这个原因。

  • 凭据管理器留存的刷新令牌
    Azure CLI会把访问令牌/刷新令牌存储在Windows凭据管理器(或Linux/macOS的密钥链)中。某些场景下,即使你登出了微软账号,凭据管理器里的有效刷新令牌仍未过期,az account get-access-token可以用它直接换取新的访问令牌,无需重新触发MFA。你可以打开Windows凭据管理器,查找Azure Service Management相关条目,删除后再测试是否需要MFA。

快速验证步骤:

  1. 执行az account list --refresh,查看当前所有可用的身份条目,确认正在使用的身份类型
  2. 执行az account clear清除所有缓存的登录上下文,再运行az account get-access-token,此时会提示需要重新登录(包括MFA验证)

内容的提问来源于stack exchange,提问作者Nick.Mc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 22:17:13