gpt4 book ai didi

python - 使用 Azure Function for python 和 ActiveDirectoryMSI 身份验证在 Azure SQL Server 数据库连接中出错

转载 作者:行者123 更新时间:2023-12-04 02:44:28 25 4
gpt4 key购买 nike

我正在尝试使用 ActiveDirectoryMSI 身份验证从适用于 python 的 Azure 函数连接 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('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 访问 token 连接到您的 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))

请使用您赢得的服务器名称和数据库名称编辑连接字符串

这是我这边的测试结果: enter image description here

关于python - 使用 Azure Function for python 和 ActiveDirectoryMSI 身份验证在 Azure SQL Server 数据库连接中出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57849384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com