Azure SQL Server数据库连接中使用Azure函数进行python与ActiveDirectoryMSI身份验证时出错
我正在尝试使用ActiveDirectoryMSI身份验证从Azure functions for python连接Azure SQL数据库 请检查以下代码:-Azure SQL Server数据库连接中使用Azure函数进行python与ActiveDirectoryMSI身份验证时出错,python,python-3.x,azure-sql-database,azure-functions,Python,Python 3.x,Azure Sql Database,Azure Functions,我正在尝试使用ActiveDirectoryMSI身份验证从Azure functions for python连接Azure SQL数据库 请检查以下代码:- import logging from . import hy_param import sys import pyodbc import azure.functions as func def main(req: func.HttpRequest) -> func.HttpResponse: logging.info
import logging
from . import hy_param
import sys
import pyodbc
import azure.functions as func
def main(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
try:
connection = pyodbc.connect('driver={%s};server=%s;database=%s;Authentication=ActiveDirectoryMSI' % (hy_param.sql_driver, hy_param.server_name, hy_param.database_name))
sql_db = connection.cursor()
logging.info("MSSQL Database Connected")
except Exception as e:
return func.HttpResponse(f"Error in sql database connection : {e}", status_code=400)
sys.exit()
return func.HttpResponse(
"Database Connected",
status_code=200
)
请检查以下错误:-
Error in sql database connection : ('08001', '[08001] [Microsoft][ODBC Driver 17 for SQL Server]SSL Provider: [error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:self signed certificate] (-1) (SQLDriverConnect)')
是否有任何方法可以使用ActiveDirectoryMSI从Azure函数连接Azure、SQL数据库?在运行此代码之前,您可以尝试以下代码以使用MSI访问令牌连接到您的Azure SQL,请确保您的函数MSI已启用,并且它具有访问您的Azure SQL的权限:
import logging
import os
import azure.functions as func
import pyodbc
import requests
import struct
msi_endpoint = os.environ["MSI_ENDPOINT"]
msi_secret = os.environ["MSI_SECRET"]
def main(req: func.HttpRequest) -> func.HttpResponse:
token_auth_uri = f"{msi_endpoint}?resource=https%3A%2F%2Fdatabase.windows.net%2F&api-version=2017-09-01"
head_msi = {'Secret':msi_secret}
resp = requests.get(token_auth_uri, headers=head_msi)
access_token = resp.json()['access_token']
accessToken = bytes(access_token, 'utf-8');
exptoken = b"";
for i in accessToken:
exptoken += bytes({i});
exptoken += bytes(1);
tokenstruct = struct.pack("=i", len(exptoken)) + exptoken;
conn = pyodbc.connect("Driver={ODBC Driver 17 for SQL Server};Server=tcp:andyserver.database.windows.net,1433;Database=database2", attrs_before = { 1256:bytearray(tokenstruct) });
cursor = conn.cursor()
cursor.execute("select @@version")
row = cursor.fetchall()
return func.HttpResponse(str(row))
请用您的服务器名和数据库名编辑连接字符串
这是我这边的测试结果:
有一种新的更好的方法,可以使用SDK和ODBC驱动程序直接连接到Azure SQL 您需要: 启用Azure功能托管服务标识MSI 为Azure SQL Server启用AAD集成 将Azure函数MSI用户添加到数据库 在pyodbc.connect中使用Authentication=ActiveDirectoryMsi。 要将MSI用户添加到数据库,必须使用AAD admin进行连接,然后运行此查询: 从外部提供者创建用户; ALTER ROLE db_datareader添加成员-授予读取数据库的权限 ALTER ROLE db_datawriter添加成员-授予写入数据库的权限 通常是Azure函数名。您还可以使用PowerShell中的get-AzureadobObjectByObjectId-ObjectId获取它 这是hello world函数的源代码: 导入日志记录 将azure.1函数导入为func Sql驱动程序 导入pyodbc def mainreq:func.HttpRequest->func.HttpResponse: 尝试: info“Python HTTP触发器函数处理了一个请求。” 以标准方式连接到Azure SQl 服务器='tcp:.数据库.windows.net' 数据库= driver='{ODBC driver 17 for SQL Server}'驱动程序13对我不起作用 使用pyodbc.connect 司机= +司机 + ;服务器= +服务器 + ;端口=1433;数据库= +数据库 + ;Authentication=ActiveDirectoryMsi,这很重要: 康涅狄格州: logging.info成功连接到数据库 以conn.cursor作为光标: 示例选择查询 cursor.execute从人员中选择名称; peopleNames= row=cursor.fetchone 而行: peopleNames+=strow[0]。条带+ row=cursor.fetchone 返回func.HttpResponsefHello{peopleNames}! 例外情况除外,如e: return func.HttpResponsestre
这里有一个完整的项目,你可以举个例子:非常感谢。我缺少SQL数据库的权限。问题解决了。我可以在没有密码的情况下将Azure函数连接到SQL Server。啊,很高兴知道@LetsLearn,如果有帮助,请标记我:@StanleyGong我无法理解以下两件事:-1。msi_endpoint=os.environ[msi_endpoint]2。msi_secret=os.environ[msi_secret]你能和我分享更多关于它的详细信息吗?嗨@AkshayGodase,当然,这是在Azure函数中使用msi获取访问令牌的过程,你可以在这个文档中看到详细信息:嗨@AkshayGodase如果你为你的函数启用了msi,这两个变量将自动定义,无需在应用程序设置中进行配置,您可以直接获取。如果您打印出这两个,您将发现这是一个Azure内部端点,用于获取令牌和秘密。