要求 - 我正在尝试从asp.net MVC应用程序连接到azure SQL DB,并且连接类型到azure SQL DB是基于令牌的"以下是从我的结束完成的设置。
一个。使用基于证书的身份验证创建了AAD应用程序(例如:MTSLocal)。
湾在SQL中添加了对上述AAD的权限。
从外部提供商创建用户[MTSLocal];
c。在代码级别,我试图通过使用客户端ID(从步骤a获得)和证书来获取访问令牌,并且我连接的资源是" https://database.windows.net" 。请参阅示例代码 -
string authority = string.Format(System.Globalization.CultureInfo.InvariantCulture, "https://login.windows.net/{0}",
"xxxx.onmicrosoft.com");
var authContext = new AuthenticationContext(authority);
AuthenticationResult result = null;
result = await authContext.AcquireTokenAsync("https://database.windows.net", AssertionCert);
token = result.AccessToken;
d。我能够检索访问令牌,但是当我尝试打开SQL连接时。我收到了上述错误。
sqlBuilder["Data Source"] = serverName;
sqlBuilder["Initial Catalog"] = databaseName;
sqlBuilder["Connect Timeout"] = 30;
string accesstoken = GetAccessToken();
using (SqlConnection connection = new SqlConnection(sqlBuilder.ConnectionString))
{
try
{
connection.AccessToken = accesstoken;
connection.Open();
}
catch (Exception ex)
{
}
}
任何有关这方面的帮助都会非常有用。
答案 0 :(得分:3)
以下是我如何解决这个问题的一些粗略和准备好的代码。我必须提供主承租人(见下面的代码。
private async Task<string> SqlServerVersion()
{
var provider = new AzureServiceTokenProvider();
var token = await provider.GetAccessTokenAsync("https://database.windows.net/", "<host tenant>.onmicrosoft.com").ConfigureAwait(false);
SqlConnectionStringBuilder csb = new SqlConnectionStringBuilder
{
csb.DataSource = "<your server>.database.windows.net";
csb.InitialCatalog = "<your database>";
};
using (var conn = new SqlConnection(csb.ConnectionString))
{
conn.AccessToken = token;
await conn.OpenAsync().ConfigureAwait(false);
using (var sqlCommand = new SqlCommand("SELECT @@VERSION", conn))
{
var result = await sqlCommand.ExecuteScalarAsync().ConfigureAwait(false);
return result.ToString();
}
}
}
答案 1 :(得分:0)
应将AAD中注册的应用程序添加到数据库的用户列表中,并将相应的角色提供给DB USER。
假设注册的应用程序的名称是&#34; App_AAD_Register_Name&#34;。将此用户添加到相应的数据库,如执行以下查询。这样,用户将被添加到DB服务器的Principal Users列表中。
从外部提供商处创建用户[App_AAD_Register_Name]。
创建一些通用角色,如下所示
创建角色[RoleUser] 走 在SCHEMA上重新选择:: dbo到[RoleUser] 走 GRANT INSERT ON SCHEMA :: dbo TO [RoleUser] GO
创建角色并给出相应的权限后,将角色分配给在第一步中创建的用户。
EXEC sp_addrolemember N&#39; RoleUser&#39;,N&#39; App_AAD_Register_Name&#39;。
完成所有这些步骤后,您将能够使用令牌连接到DB。
这些步骤对我有用。