如何在不使用账号密码的情况下实现Django应用与Azure SQL Server的身份验证?
两种方案都可以实现代码中不出现用户名和密码的目标,具体操作如下:
方案一:Azure AD托管身份验证(完全无密码)
这是最推荐的方案,通过Azure托管身份直接完成身份验证,全程无需存储任何凭据。
为Django Web应用启用系统分配托管身份
进入Azure门户的Web应用资源,找到「身份」选项卡,切换到「系统分配」标签,开启状态后保存。配置SQL Server允许该身份访问
- 进入SQL Server资源的「Azure Active Directory」选项卡,设置Azure AD管理员(可选择AD用户或组)。
- 使用Azure AD管理员账户登录SQL Server,执行以下SQL创建授权用户:
CREATE USER [你的Web应用名称] FROM EXTERNAL PROVIDER; -- 按需添加数据读写等权限 ALTER ROLE db_datareader ADD MEMBER [你的Web应用名称]; ALTER ROLE db_datawriter ADD MEMBER [你的Web应用名称];
修改Django数据库配置(settings.py)
使用django-mssql-backend和pyodbc驱动,配置Azure AD托管身份验证:import os DATABASES = { 'default': { 'ENGINE': 'mssql', 'NAME': os.environ.get('DB_NAME'), # 也可通过应用设置注入,避免硬编码 'HOST': os.environ.get('DB_HOST'), 'PORT': '1433', 'OPTIONS': { 'driver': 'ODBC Driver 18 for SQL Server', 'authentication': 'ActiveDirectoryMsi', 'TrustServerCertificate': 'no', }, } }安装依赖:
pip install django-mssql-backend pyodbc
方案二:Azure Key Vault存储凭据(隔离敏感信息)
如果无法使用Azure AD身份验证,可通过Key Vault存储SQL凭据,代码通过托管身份从Vault读取,避免硬编码。
为Web应用启用托管身份(同方案一)
配置Key Vault及权限
- 创建Key Vault资源,在「访问策略」中添加Web应用的托管身份,授予「机密读取」权限。
- 在Key Vault的「机密」中添加两个条目:
sql-server-username和sql-server-password,对应SQL的账号密码。
配置Web应用的应用设置
在Web应用的「配置」->「应用程序设置」中添加AZURE_KEY_VAULT_URI,值为你的Key Vault地址(如https://xxx.vault.azure.net/)。修改Django数据库配置
通过Azure SDK从Key Vault拉取凭据:import os from azure.identity import ManagedIdentityCredential from azure.keyvault.secrets import SecretClient def get_secret(secret_name): credential = ManagedIdentityCredential() client = SecretClient(vault_url=os.environ['AZURE_KEY_VAULT_URI'], credential=credential) return client.get_secret(secret_name).value DATABASES = { 'default': { 'ENGINE': 'mssql', 'NAME': os.environ.get('DB_NAME'), 'HOST': os.environ.get('DB_HOST'), 'PORT': '1433', 'USER': get_secret('sql-server-username'), 'PASSWORD': get_secret('sql-server-password'), 'OPTIONS': { 'driver': 'ODBC Driver 18 for SQL Server', 'TrustServerCertificate': 'no', }, } }安装依赖:
pip install django-mssql-backend pyodbc azure-identity azure-keyvault-secrets
注意:方案一无需存储任何凭据,安全性更高,优先推荐;方案二适合遗留场景或无法启用AD身份验证的SQL Server实例。
内容的提问来源于stack exchange,提问作者Luca

