无法使用C#中的AAD连接到Azure SQL数据库

时间:2018-05-10 13:10:32

标签: c# sql-server azure authentication azure-active-directory

我们的开发人员最近在我们的Azure SQL Server中启用了AAD身份验证,并将我的身份(例如 my.identity@mycompany.com )添加为 MyDatabase 的dbo。我可以使用SSMS成功连接到数据库,现在我想使用我的代码中的相同标识进行连接:

using System;
using System.Threading.Tasks;
using System.Data.SqlClient;
using Microsoft.Azure.Services.AppAuthentication;

namespace AzureADAuth {
    class Program {
        static async Task Main(string[] args) {
            var azureServiceTokenProvider = new AzureServiceTokenProvider();
            string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://management.azure.com/");

            Principal principal = azureServiceTokenProvider.PrincipalUsed;
            Console.WriteLine($"AppId: {principal.AppId}");
            Console.WriteLine($"IsAuthenticated: {principal.IsAuthenticated}");
            Console.WriteLine($"TenantId: {principal.TenantId}");
            Console.WriteLine($"Type: {principal.Type}");
            Console.WriteLine($"UserPrincipalName: {principal.UserPrincipalName}");

            using (var connection = new SqlConnection("Data Source=########.database.windows.net; Initial Catalog=MyDatabase;")) {
                connection.AccessToken = accessToken;
                await connection.OpenAsync();

                var command = new SqlCommand("select CURRENT_USER", connection);
                using (SqlDataReader reader = await command.ExecuteReaderAsync()) {
                    await reader.ReadAsync();
                    Console.WriteLine(reader.GetValue(0));
                }
            }

            Console.ReadKey();
        }
    }
}

不幸的是,它不起作用。这是输出:

AppId:
IsAuthenticated: True
TenantId: ########-####-####-bc14-789b44d11a3c
Type: User
UserPrincipalName: my.identity@mycompany.com

Unhandled Exception: System.Data.SqlClient.SqlException: Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.
   at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions,
SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, Sq
lConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool pool, String accessToken, Boolean applyTr
ansientFaultHandling)

AzureServiceTokenProvider已成功从Azure CLI获取我的身份,但SQL登录失败。我错过了什么?

P.S。

我瞄准.NET完整框架4.7; Microsoft.Azure.Services.AppAuthentication包是最新的,1.0.1;我的机器没有加入任何域名(不确定它是否重要,因为我不需要AAD集成的身份验证,仅基于令牌)

2 个答案:

答案 0 :(得分:2)

尝试使用database.windows.net代替management.azure.com  选项,

string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://database.windows.net/");

答案 1 :(得分:0)

对于遇到此问题的任何人-我在用户遇到此确切问题却没有解决方案的情况下,搜查了多个资源。但是,最终能够通过添加SQL数据库所在的“承租人”来解决我的问题。由于我有多个Azure订阅。

在上面的代码中获取令牌:

return provider.GetAccessTokenAsync("https://database.windows.net/");

我还需要添加租户:

return provider.GetAccessTokenAsync("https://database.windows.net/", "hosttenant.onmicrosoft.com");