如何在 Azure SQL 数据库中使用托管标识
介绍
托管标识是 Microsoft Azure 的一项功能,允许 Azure 资源使用其他受支持的 Azure 资源进行身份验证或授权。其吸引力在于,无需将数据库密码等机密复制到开发人员的计算机上或签入源代码管理。
在本指南中,您将了解如何使用托管标识将 .NET 应用服务连接到 Azure SQL 数据库。
注意:从Microsoft.Data.SqlClient 版本 2.1.0-preview2开始,nuget 包为托管标识提供了开箱即用的支持。
配置 Azure 数据库
为了允许托管标识连接到 Azure SQL 数据库,您需要启用 Azure Active Directory (AD) 身份验证并在数据库中创建托管用户。
要为 Azure SQL Server 启用 Azure AD 身份验证,请确保为数据库服务器配置了 Azure AD 管理员。
然后,通过创建包含用户来从托管标识启用身份验证。这与需要服务器登录名和数据库用户的本地 SQL Server 实例不同。首先,确保为应用服务设置了系统分配的标识。将标识分配给应用服务后,运行以下 SQL 以创建包含用户,该用户具有一些可以读取和写入数据库的角色。
create user [my-app-service] from external provider;
alter role db_datareader add member [my-app-service];
alter role db_datawriter add member [my-app-service];
create user [my-app-service/slots/staging] from external provider;
alter role db_datareader add member [my-app-service/slots/staging];
alter role db_datawriter add member [my-app-service/slots/staging];
注意:my-app-service是一个占位符。您需要将其替换为您自己的应用服务的名称。此外,对于系统分配的身份,不同的部署槽有各自的身份。
更新 SQL 连接以使用托管标识
现在您已创建 SQL 用户并为其分配了读写角色,您需要更改应用以使用托管标识进行身份验证和授权。
要开始使用 Azure App Service 托管标识,请创建一个新项目并安装一些包。
mkdir PLSQLManagedIdentity
cd PLSQLManagedIdentity
dotnet new mvc
dotnet add package Microsoft.Azure.Services.AppAuthentication
dotnet add package Microsoft.Data.SqlClient
包Microsoft.Azure.Services.AppAuthentication是一个简化身份验证的 Azure SDK。
当您在开发计算机上运行代码时,它将使用 Azure CLI 或 Visual Studio 登录进行身份验证。当您在 Azure 应用服务中运行代码时,它将使用系统分配的标识。
接下来将SqlAppAuthenticationProvider类添加到您的项目中。
/// <summary>
/// An implementation of SqlAuthenticationProvider that implements Active Directory Interactive SQL authentication.
/// </summary>
public class SqlAppAuthenticationProvider : SqlAuthenticationProvider
{
private static readonly AzureServiceTokenProvider _tokenProvider = new AzureServiceTokenProvider();
/// <summary>
/// Acquires an access token for SQL using AzureServiceTokenProvider with the given SQL authentication parameters.
/// </summary>
/// <param name="parameters">The parameters needed in order to obtain a SQL access token</param>
/// <returns></returns>
public override async Task<SqlAuthenticationToken> AcquireTokenAsync(SqlAuthenticationParameters parameters)
{
var authResult = await _tokenProvider.GetAuthenticationResultAsync("https://database.windows.net/").ConfigureAwait(false);
return new SqlAuthenticationToken(authResult.AccessToken, authResult.ExpiresOn);
}
/// <summary>
/// Implements virtual method in SqlAuthenticationProvider. Only Active Directory Interactive Authentication is supported.
/// </summary>
/// <param name="authenticationMethod">The SQL authentication method to check whether supported</param>
/// <returns></returns>
public override bool IsSupported(SqlAuthenticationMethod authenticationMethod)
{
return authenticationMethod == SqlAuthenticationMethod.ActiveDirectoryInteractive;
}
}
然后在您的Program.cs中,使用以下内容作为主方法的第一行注册新的SqlAuthenticationProvider 。
SqlAuthenticationProvider.SetProvider(SqlAuthenticationMethod.ActiveDirectoryInteractive, new SqlAppAuthenticationProvider());
这两个代码片段将一起查找包含Authentication=Active Directory Interactive的 SQL 连接字符串。 找到后,它们将使用AzureServiceTokenProvider获取访问令牌以使用 Azure SQL 数据库进行身份验证。
更新连接字符串
现在,您已设置好授权应用访问 Azure 数据库的所有步骤。您的连接字符串可以更新为以下内容:
Server=xxxxxxx.database.windows.net,1433;Database=yyyyyyyyy;UID=a;Authentication=Active Directory Interactive
只需指定服务器、身份验证和数据库名称。UID设置为任意值,因为它是连接字符串通过验证所必需的。但是,它不用于系统分配的托管标识和 Azure CLI 身份验证。
注意:如果您使用的是用户分配的身份而不是全局 Azure 区域,则需要修改SqlAppAuthenticationProvider类。请参阅 Microsoft 的SqlAppAuthenticationProvider实现,它分配了更多内存,但作为参考更加灵活。
结论
Microsoft Azure 拥有越来越多的支持 Azure 资源托管标识的服务。使用托管标识可以增强应用程序的安全性,因为您无需亲自管理机密。您的应用现在可以连接到 Azure SQL 数据库,而无需用户名或密码。要掌握这些技能,请阅读如何定义 Azure 基于角色的访问控制 (RBAC)。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~