首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用MFA Active交互身份验证连接Python中的Azure SQL而不使用Microsoft.IdentityModel.Clients.ActiveDirectory dll

使用MFA Active交互身份验证连接Python中的Azure SQL而不使用Microsoft.IdentityModel.Clients.ActiveDirectory dll
EN

Stack Overflow用户
提问于 2019-10-17 20:43:44
回答 3查看 12.9K关注 0票数 8

要使用MFA连接到Azure SQL数据库(在SSMS中是"Active Directory - Universal"),微软建议使用Microsoft.IdentityModel.Clients.ActiveDirectory与C#连接,目前只有一个教程。

在Python或Powershell的常规ODBC连接字符串中设置Authentication='Active Directory Interactive';将导致错误。

代码语言:javascript
运行
复制
Cannot find an authentication provider for 'ActiveDirectoryInteractive'

这似乎是因为根据微软在https://learn.microsoft.com/en-us/azure/sql-database/active-directory-interactive-connect-azure-sql-db的示例代码,在创建连接时需要显式地创建自己的auth类:

代码语言:javascript
运行
复制
        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提供程序?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-18 01:46:54

ODBC驱动程序支持MFA身份验证,但只支持windows:

我在中进行了测试,它也能工作。

下面是我的pyodbc代码,它使用AAD身份验证连接到我的Azure数据库:

代码语言:javascript
运行
复制
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环境中运行得很好。

希望这能有所帮助。

票数 11
EN

Stack Overflow用户

发布于 2021-05-25 16:52:30

基于MacOS / Linux的AAD认证

我也面临着同样的问题,但在MacOs上。如上所述,使用“ActiveDirectoryInteractive”的ODBC选项仅适用于Windows。

为了使用AAD连接数据库,我也使用pyodbc,但使用了访问令牌。为了获得令牌,您需要做一些事情:

要求

  1. Azure CLI
  2. Microsoft Server驱动程序(Linux)

使用说明

在运行下面的代码之前,必须使用azure进行身份验证,这样才能从cmd:az login运行。

代码语言:javascript
运行
复制
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的版本,有些人可能会使用上面的代码体验不同的行为。

  1. 确保始终使用ODBC驱动程序的最新版本。
  2. 如果连接返回一个类似于'SSL提供程序:错误:0A 000086:SSL例程::证书验证失败:无法获得本地颁发者证书‘的错误。将TrustServerCertificate=Yes;添加到连接字符串可能会有所帮助。

参考资料

https://pypi.org/project/azure-identity/

https://github.com/AzureAD/azure-activedirectory-library-for-python/wiki/Connect-to-Azure-SQL-Database

票数 12
EN

Stack Overflow用户

发布于 2022-07-13 13:38:48

如果直接在UTF-16 LE中编码,则不需要像在示例中那样使用循环。

因此,这也是可行的。

代码语言:javascript
运行
复制
# get bytes from token obtained
tokenb = bytes(databaseToken[0], "UTF-16-LE")
tokenstruct = struct.pack("=i", len(tokenb)) + tokenb;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58440480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档