使用AAD身份从App Service连接到Azure SQL

时间:2018-11-15 14:03:42

标签: azure-sql-database azure-active-directory azure-web-sites

将内部Windows应用程序(.net 4.6.1)的用户使用Windows身份验证,然后将AD Integrated Authentication连接到MS SQL数据库,该应用程序已迁移到Azure。

理想情况下,应该保留现有的安全机制,即向AD用户授予数据库对象的权限,并让DB成为应用程序的安全源。

已经创建并配置了SQL数据库的副本。

如果我在本地运行Web应用程序,但使用新的Azure数据库,则一切正常。

如果运行此命令,我将获得预期的AD用户:

SELECT CURRENT_USER;

现在,当我将完全相同的应用程序部署到Azure App Service并启用Azure Active Directory身份验证和托管服务身份时,将在Web应用程序上正确验证用户,但无法连接到SQL数据库和返回以下错误:

  

错误= System.Data.SqlClient.SqlErrorCollection ClientConnectionId =   e9f0c48a-3159-465c-ab72-c1da99761b8f类= 14行号= 65536   号码= 18456程序=服务器=   xxxxxxxxxxx.tr4.canadacentral1-a.worker.database.windows.net,11057   状态= 1源= .Net SqlClient数据提供程序ErrorCode =   -2146232060消息=用户'NT AUTHORITY \ ANONYMOUS LOGON'登录失败

如果我禁用托管服务身份,则会收到此错误:

  

InnerExceptions =   System.Collections.ObjectModel.ReadOnlyCollection`1 [System.Exception]   消息=发生一个或多个错误。数据=   System.Collections.ListDictionaryInternal InnerException =   Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException:   参数:连接字符串:[未指定连接字符串],   资源:https://database.windows.net/,权限:。例外   消息:尝试了以下4种方法来获取访问令牌,但是   他们都没有工作。参数:连接字符串:[无连接   指定的字符串],资源:https://database.windows.net/,权限:   。异常消息:尝试使用托管服务获取令牌   身份。无法连接到托管服务标识(MSI)   端点。请检查您是否正在运行的Azure资源上运行   具有MSI设置。参数:连接字符串:[无连接字符串   指定],资源:https://database.windows.net/,权限:。   异常消息:尝试使用Visual Studio获取令牌。访问   无法获取令牌。没有Visual Studio令牌提供程序文件   发现于   “ D:\ local \ LocalAppData.IdentityService \ AzureServiceAuth \ tokenprovider.json”   参数:连接字符串:[未指定连接字符串],   资源:https://database.windows.net/,权限:。例外   消息:试图使用Azure CLI获取令牌。存取凭证不能为   获得。无法将“ az”识别为内部或外部命令,   可操作的程序或批处理文件。参数:连接字符串:[否   指定的连接字符串],资源:https://database.windows.net/,   权限:https://login.microsoftonline.com/common。例外   消息:试图使用Active Directory Integrated获取令牌   身份验证。无法获取访问令牌。   get_user_name_failed:无法获取用户名内部异常:   指定域名的格式无效   Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider.d__14.MoveNext()

这是我想做的可能吗?如果是,我想念什么?任何想法将不胜感激。

作为参考,这是返回SQL连接的方法:

private SqlConnection GetSqlConnection()
{
    var accessToken = new AzureServiceTokenProvider().GetAccessTokenAsync("https://database.windows.net/").Result;

    return new SqlConnection
    {
        ConnectionString = WebConfigurationManager.ConnectionStrings["Default"].ConnectionString,
        AccessToken = accessToken
    };
}

...这是连接字符串:

  <connectionStrings>
    <add name="Default" connectionString="Data Source=myserver.database.windows.net;Initial Catalog=MyDB;" providerName="System.Data.SqlClient" />
  </connectionStrings>

注意:本地AD已与其Azure AD副本同步。

3 个答案:

答案 0 :(得分:1)

我认为要解决您的问题,您必须执行以下操作:

  • 打开系统分配的托管身份(该功能不适用于用户分配的身份,但也许我错过了一些东西)
  • 授予用户作为数据库中外部提供者的访问权限:
    • 对于Web应用程序,它是Web应用程序的名称
    • 如果您正在使用部署插槽,则SQL用户名是{application-name}/slots/{slot-name}
  • 更改连接字符串以使用交互式身份验证。可能是这样的:Server=tcp:{server}.database.windows.net,1433;Initial Catalog={DatabaseName};Persist Security Info=False;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=False;Authentication='Active Directory Interactive'。这也适用于EntityFramework,但是如果直接在Azure中设置连接字符串,则需要选择Custom而不是SqlAzure作为提供程序。

答案 1 :(得分:1)

确保已在Azure SQL中添加了身份用户并授予了必需的特权。

从外部提供者创建用户[MyAppIdentity] 走 更改角色db_datareader添加成员[MyAppIdentity]; 更改角色db_datawriter添加成员[MyAppIdentity];

答案 2 :(得分:0)

部署应用程序后,请将您的应用程序设置和连接字符串放在Azure上的webapp MyService.BUS.observe(this, Observer { it?.let { // Do what you need to do here } }) 选项中。请参阅此article

enter image description here

注意:它已从Azure App Service的– Application Settings刀片中配置的“应用程序设置”中拉出了值,而不是从Application Settings文件中拉出了值。这样,您可以随时更改这些可配置的值,而无需依赖开发人员。相同的规则甚至适用于Web.config