SQL AAD基于令牌的身份验证-用户登录失败'NT授权\匿名登录



要求-我正试图从asp.net MVC应用程序连接到azure SQL DB,与azure SQL数据库的连接类型是"基于令牌的",下面是我完成的设置。

a。创建了一个具有基于证书的身份验证的AAD应用程序(例如:MTSLocal)。

b。在SQL中为上述AAD添加了权限。

CREATE USER[MTSLocal]FROM外部提供程序;

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)
{
}
}

这方面的任何帮助都会非常有帮助。

下面是一些关于我如何解决这个问题的粗略而现成的代码。我不得不提供主机租户(请参阅下面的代码。

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();
}
}
}

在AAD中注册的应用程序应添加到DB的用户列表中,并且应将相应的角色赋予DB USER。

假设注册的应用程序的名称为"App_AAD_Register_name"。将该用户添加到相应的DB中,就像执行下面的查询一样。这样,用户将被添加到DB服务器的Principal Users列表中。

从外部提供者创建用户[App_AAD_Register_Name]。

创建一些通用角色,如下面的

创建角色[角色用户]去对SCHEMA::dbo TO[RoleUser]进行GRANT SELECT去对SCHEMA::dbo TO[RoleUser]的GRANT INSERT转到

创建角色并授予相应权限后,将角色分配给在第一步中创建的用户。

EXEC sp_addrolemember N'RoleUser',N'App_AAD_Register_Name'。

完成所有这些步骤后,您将能够使用令牌连接到DB。

这些步骤对我有效。

相关内容

最新更新