首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用1) Python (本地脚本--将不是Azure函数)访问Azure SQL Server;2) pyodbc & 3) Azure用户托管标识

使用1) Python (本地脚本--将不是Azure函数)访问Azure SQL Server;2) pyodbc & 3) Azure用户托管标识
EN

Stack Overflow用户
提问于 2021-12-27 20:39:35
回答 2查看 398关注 0票数 0

我已经在本地机器上创建了一个Python脚本&我正在尝试在Azure SQL Server中进行身份验证(即无服务器(即非托管实例))。与其将creds存储在代码中,我希望利用用户管理标识(UMI)对我的Server进行身份验证。

我在Azure门户中创建了UMI,将它分配给我的server,并在SQL Server中授予它读、写和管理授权。

我在脚本中使用pyodbc &我相信连接字符串有问题。在查看了文档& vids之后,我认为可能是这样的,我可以简单地使用UMI客户端id,而不是使用Key Vault (因为如果可能的话,我宁愿不使用它);类似地,如果没有必要,我不想使用ODBC GUI客户机(即ODBC数据源管理员)来存储creds。

我的想法是,至少我必须通过pyodbc连接字符串传入UMI客户端id字符串,但同样地,我对此没有太多的经验。

以下是我的连接字符串:

代码语言:javascript
复制
db_connect = pyodbc.connect(f"DRIVER={pyodbc_driver}; SERVER={pyodbc_server}; DATABASE={pyodbc_db}; UID={pyodbc_umi_client_id}; Authentication=ActiveDirectoryMsi", autocommit=True)

下面是我遇到的错误:

...Failed用于在ActiveDirectoryMSI(身份验证选项为“ActiveDirectoryMSI”).\r\nError代码0xA 190中验证用户“pyodbc_umi_client_id”;状态41360\r\n (0);用于SQL提供程序的CE267ODBC驱动程序17 :超时错误258。(258);用于SQL ServerLogin超时的CE267ODBC驱动程序17过期(0);用于SQL ServerUnable的CE267ODBC驱动程序17用于由于登录响应延迟而完成登录过程(258)")

对于UID,我尝试了Azure门户上UMI中的客户机ID字符串。此外,我还尝试从Azure模块中导入以下内容:

代码语言:javascript
复制
from azure.identity import DefaultAzureCredential
...
pyodbc_umi_client_id = 'client_id' # client id string from umi in azure portal
db_umi_crd = DefaultAzureCredential(managed_identity_client_id=pyodbc_umi_client_id)

以下是删除标识信息的所有脚本,它有一定的帮助:

代码语言:javascript
复制
"""Dec 27, 2021

Want to connect to SQL db by using Azure
user-managed identity (UMI).
"""

import datetime
from azure.identity import DefaultAzureCredential
import pyodbc


# global vars
program_name = 'AZURE SQL UMI CONNECTION' 
original_date = datetime.datetime(2021, 12, 27)


def main():
    """Run main part (i.e., all functions) of the program

    Arguments:
        None

    Returns:
        None

    Raises:
        None

    """
    print_header(program_name, original_date)
    db_work()


def db_work():
    """Connect to the db and do work

        Arguments:
        None

    Returns:
        None

    Raises:
        None
    """
    # connection string vars
    pyodbc_driver = '{ODBC Driver 17 for SQL Server}'
    pyodbc_server = 'tcp:server_url,1433'
    pyodbc_db = 'sql_db'
    pyodbc_umi_client_id = 'client_id' # client id string from umi in azure portal
    db_umi_crd = DefaultAzureCredential(managed_identity_client_id=pyodbc_umi_client_id)

    # connection string
    # db_connect = pyodbc.connect(f"DRIVER={pyodbc_driver}; SERVER={pyodbc_server}; DATABASE={pyodbc_db}; UID={db_umi_crd}")
    db_connect = pyodbc.connect(f"DRIVER={pyodbc_driver}; SERVER={pyodbc_server}; DATABASE={pyodbc_db}; UID={pyodbc_umi_client_id}; Authentication=ActiveDirectoryMsi", autocommit=True)

    # db cursor
    db_cursor = db_connect.cursor()

    # do work
    rows = db_cursor.execute('select * from orderitems').fetchall()
    for row in rows:
        print(row)


def print_header(program_name, original_date, border='*'):
    """Print header indicating name of program

    Arguments:
        Program name: Positional arg. This is global var.
        Original Date: Positional arg. Date script was originally created.
        Border: Keyword arg. Border that is to print around name of program.

    Returns:
        None

    Raises:
        None
    """
    program_name_len = len(program_name) + len(str(original_date))
    print()
    print(border * program_name_len)
    print(program_name, ' ', str(original_date))
    print(border * program_name_len)
    print()



if __name__ == '__main__':
    main()

耽误您时间,实在对不起。

EN

回答 2

Stack Overflow用户

发布于 2021-12-28 13:22:12

我希望利用用户管理标识(UMI)对我的Server进行身份验证。

如@Ondrej 这里所建议

当前,Azure SQL的服务器标识不支持用户分配的托管标识(UMI)

基于DOC女士

版本17.6之前的Linux和macOS上的ODBC驱动程序只支持直接针对Azure Active的Azure Active身份验证。如果您正在使用来自Linux或macOS客户端的Azure Active Directory用户名/密码身份验证,而且您的Active配置要求客户端针对Active端点进行身份验证,则身份验证可能失败。截至驱动程序版本17.6,此限制已被取消。

如果试图使用访问令牌进行身份验证:

ODBC驱动程序版本13.1仅支持Windows上的此身份验证。

编辑:获得更多信息,请参阅此所以线

票数 0
EN

Stack Overflow用户

发布于 2021-12-30 11:36:41

@AjayKumarGhose

使用Microsoft Q&A后从Microsoft收到以下信息:

感谢使用微软问答!您将收到此错误,因为您不能使用用户指定的标识或>系统指定的托管标识从本地>环境访问SQL服务器,因为这些标识用于访问Azure AD受保护的服务>来自其他Azure服务(如Azure函数、web应用程序等)的资源。有关详细信息,请参阅托管标识文档。您需要在代码中提供用户名和密码,或者可以将它们作为环境变量存储。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70500197

复制
相关文章

相似问题

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