使用托管身份连接Kentico 13与Azure SQL数据库:解决认证关键字报错
解决Kentico 13连接Azure SQL时的"Keyword not supported: 'authentication'"错误
问题原因
Kentico 13默认依赖的System.Data.SqlClient(.NET Framework旧版SQL客户端)不支持Authentication连接字符串关键字,该关键字是后续Microsoft.Data.SqlClient才引入的功能,因此直接使用带Authentication的连接字符串会触发报错。
解决方案
方案1:自定义数据库连接工厂(推荐,支持所有Azure AD验证方式)
通过替换Kentico默认的连接工厂,改用支持Azure AD验证的Microsoft.Data.SqlClient来创建数据库连接,步骤如下:
- 向Kentico项目安装
Microsoft.Data.SqlClientNuGet包(选择与项目.NET Framework版本兼容的版本,推荐4.0+) - 创建自定义连接工厂类:
using CMS.DataEngine; using Microsoft.Data.SqlClient; public class AzureADSqlConnectionFactory : SqlConnectionFactory { public override System.Data.SqlClient.SqlConnection CreateConnection(string connectionString) { // 使用Microsoft.Data.SqlClient创建连接,兼容基类返回类型 var msSqlConnection = new Microsoft.Data.SqlClient.SqlConnection(connectionString); return (System.Data.SqlClient.SqlConnection)msSqlConnection; } }
- 在项目初始化代码中注册自定义工厂(例如
Global.asax的Application_Start方法):
protected void Application_Start() { // 注册自定义连接工厂,需在Kentico初始化前执行 ConnectionHelper.ConnectionStringFactory = new AzureADSqlConnectionFactory(); CMS.DataEngine.ApplicationHelper.InitApp(); }
- 保持原连接字符串不变即可使用
Active Directory Device Code Flow验证:
"Server=tcp:<MyServer>.database.windows.net,1433;Initial Catalog=<MyDB>;Authentication=Active Directory Device Code Flow;"
方案2:改用Azure AD集成身份验证(本地开发简化方案)
如果你的本地机器已加入Azure AD,且当前登录账号拥有目标SQL数据库的访问权限,可改用以下连接字符串,无需修改代码:
"Server=tcp:<MyServer>.database.windows.net,1433;Initial Catalog=<MyDB>;Integrated Security=True;Authentication=Active Directory Integrated;"
注意:此方式要求项目运行的.NET Framework版本不低于4.7.2,且本地账号已在Azure SQL中被授予数据库权限(需在SQL中创建对应AD用户并分配角色)。
权限配置前提
无论使用哪种方案,都需要确保你的Azure AD身份(设备码登录账号/集成身份/托管身份)在Azure SQL数据库中拥有权限:
- 在Azure SQL服务器的Azure Active Directory设置中,指定AD管理员
- 登录数据库后执行SQL命令创建AD用户并分配角色:
CREATE USER [你的AD账号/托管身份名称] FROM EXTERNAL PROVIDER; ALTER ROLE db_owner ADD MEMBER [你的AD账号/托管身份名称];
内容的提问来源于stack exchange,提问作者Vidhyardhi Gorrepati
相关产品推荐
相关产品推荐

