我们的开发人员最近在我们的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集成的身份验证,仅基于令牌)
答案 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");