基于SQL AAD令牌的身份验证 - 用户“NT AUTHORITY \ ANONYMOUS LOGON”登录失败

时间:2017-11-27 08:48:30

标签: sql-server asp.net-mvc authentication azure-sql-database azure-active-directory

要求 - 我正在尝试从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)
            {

            }
        }

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

2 个答案:

答案 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。

这些步骤对我有用。