要使用MFA连接到Azure SQL数据库(在SSMS中是"Active Directory - Universal"),微软建议使用Microsoft.IdentityModel.Clients.ActiveDirectory与C#连接,目前只有一个教程。
在Python或Powershell的常规ODBC连接字符串中设置Authentication='Active Directory Interactive';
将导致错误。
Cannot find an authentication provider for 'ActiveDirectoryInteractive'
这似乎是因为根据微软在https://learn.microsoft.com/en-us/azure/sql-database/active-directory-interactive-connect-azure-sql-db的示例代码,在创建连接时需要显式地创建自己的auth类:
public static void Main(string[] args)
{
var provider = new ActiveDirectoryAuthProvider();
SC.SqlAuthenticationProvider.SetProvider(
SC.SqlAuthenticationMethod.ActiveDirectoryInteractive,
//SC.SqlAuthenticationMethod.ActiveDirectoryIntegrated, // Alternatives.
//SC.SqlAuthenticationMethod.ActiveDirectoryPassword,
provider);
Program.Connection();
}
我希望与pyodbc连接,因此无法实现ActiveDirectoryInteractive提供程序。
是否有任何方法可以使用OAuth一般地获取令牌并在连接字符串中使用它,或者在不使用.NET的情况下实现ActiveDirectoryInteractive提供程序?
发布于 2019-10-18 01:46:54
ODBC驱动程序支持MFA身份验证,但只支持windows:
我在中进行了测试,它也能工作。
下面是我的pyodbc
代码,它使用AAD身份验证连接到我的Azure数据库:
import pyodbc
server = '***.database.windows.net'
database = 'Mydatabase'
username ='****@****.com'
Authentication='ActiveDirectoryInteractive'
driver= '{ODBC Driver 17 for SQL Server}'
conn = pyodbc.connect('DRIVER='+driver+
';SERVER='+server+
';PORT=1433;DATABASE='+database+
';UID='+username+
';AUTHENTICATION='+Authentication
)
print(conn)
它在我的windows环境中运行得很好。
希望这能有所帮助。
发布于 2021-05-25 16:52:30
基于MacOS / Linux的AAD认证
我也面临着同样的问题,但在MacOs上。如上所述,使用“ActiveDirectoryInteractive”的ODBC选项仅适用于Windows。
为了使用AAD连接数据库,我也使用pyodbc,但使用了访问令牌。为了获得令牌,您需要做一些事情:
要求
使用说明
在运行下面的代码之前,必须使用azure进行身份验证,这样才能从cmd:az login
运行。
from azure.identity import AzureCliCredential
import struct
import pyodbc
# input params
server = '<your server address>'
database = '<database name>'
query = 'SELECT * from dbo.Address;'
# Use the cli credential to get a token after the user has signed in via the Azure CLI 'az login' command.
credential = AzureCliCredential()
databaseToken = credential.get_token('https://database.windows.net/')
# get bytes from token obtained
tokenb = bytes(databaseToken[0], "UTF-8")
exptoken = b'';
for i in tokenb:
exptoken += bytes({i});
exptoken += bytes(1);
tokenstruct = struct.pack("=i", len(exptoken)) + exptoken;
# build connection string using acquired token
connString = "Driver={ODBC Driver 17 for SQL Server};SERVER="+server+";DATABASE="+database+""
SQL_COPT_SS_ACCESS_TOKEN = 1256
conn = pyodbc.connect(connString, attrs_before = {SQL_COPT_SS_ACCESS_TOKEN:tokenstruct});
# sample query
cursor = conn.cursor()
cursor.execute(query)
row = cursor.fetchone()
while row:
print (str(row[0]) + " " + str(row[1]))
row = cursor.fetchone()
故障排除
根据ODBC驱动程序和MacOS的版本,有些人可能会使用上面的代码体验不同的行为。
TrustServerCertificate=Yes;
添加到连接字符串可能会有所帮助。参考资料
发布于 2022-07-13 13:38:48
如果直接在UTF-16 LE
中编码,则不需要像在示例中那样使用循环。
因此,这也是可行的。
# get bytes from token obtained
tokenb = bytes(databaseToken[0], "UTF-16-LE")
tokenstruct = struct.pack("=i", len(tokenb)) + tokenb;
https://stackoverflow.com/questions/58440480
复制相似问题