Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure SQL Server数据库连接中使用Azure函数进行python与ActiveDirectoryMSI身份验证时出错_Python_Python 3.x_Azure Sql Database_Azure Functions - Fatal编程技术网

Azure SQL Server数据库连接中使用Azure函数进行python与ActiveDirectoryMSI身份验证时出错

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

我正在尝试使用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('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内部端点,用于获取令牌和秘密。