我已经在本地机器上创建了一个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字符串,但同样地,我对此没有太多的经验。
以下是我的连接字符串:
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模块中导入以下内容:
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)以下是删除标识信息的所有脚本,它有一定的帮助:
"""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()耽误您时间,实在对不起。
发布于 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上的此身份验证。
编辑:获得更多信息,请参阅此所以线
发布于 2021-12-30 11:36:41
@AjayKumarGhose
使用Microsoft Q&A后从Microsoft收到以下信息:
感谢使用微软问答!您将收到此错误,因为您不能使用用户指定的标识或>系统指定的托管标识从本地>环境访问SQL服务器,因为这些标识用于访问Azure AD受保护的服务>来自其他Azure服务(如Azure函数、web应用程序等)的资源。有关详细信息,请参阅托管标识文档。您需要在代码中提供用户名和密码,或者可以将它们作为环境变量存储。
https://stackoverflow.com/questions/70500197
复制相似问题