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

11

要求 - 我正在尝试从asp.net MVC应用程序连接到Azure SQL数据库,连接类型为“基于令牌”,以下是我端完成的设置。

a. 创建了一个AAD应用程序(例如:MTSLocal),采用基于证书的身份验证方式。

b. 在SQL中添加了对上述AAD的权限。

CREATE USER [MTSLocal] FROM external provider;

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

            }
        }

任何对此的帮助都将非常有帮助。


3
请在您的问题中附上您的代码,并提供与上面评论中提到的设置有关的信息。好的,您可能是从另一个问题中获取了代码,但该问题将来可能会被删除或修改。为了使这个问题有意义,所有必要的信息都必须包含在其中。请注意,如果问题中没有所有必需的信息,版主可以合理地关闭该问题 - 请参阅 https://stackoverflow.com/help/on-topic 了解原因。 - ADyson
@T-Heron - 我已经附上了所有细节,任何帮助都将非常有用。 - Pritish Mohapatra
请确保 SQL 服务正在以本地系统身份运行。另外,请使用 @ 通知,以确保我能及时看到您的消息。 - T-Heron
1
请问您能否编辑您的问题并添加所需信息。在评论中阅读很困难。 - T-Heron
显示剩余6条评论
2个回答

4
这是我解决此问题时编写的粗糙代码。我必须提供主机租户(请参见下面的代码中的)。
    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();
            }
        }
    }

@amol-natu 哇,添加尾随的 / 解决了我的匿名登录错误。谢谢你。 - Justin J Stark

1
在AAD注册的应用程序应添加到用户列表和相应的角色应授予DB USER。例如,注册的应用程序名称为“App_AAD_Register_Name”。像执行以下查询一样将此用户添加到相应的DB中。这样,用户将添加到DB服务器的主要用户列表中。
CREATE USER [App_AAD_Register_Name] FROM EXTERNAL PROVIDER.
创建一些通用角色,如下所示。
CREATE ROLE [RoleUser] GO GRANT SELECT ON SCHEMA :: dbo TO [RoleUser] GO GRANT INSERT ON SCHEMA :: dbo TO [RoleUser] GO
创建角色并授予相应权限后,将该角色分配给第一步创建的用户。
EXEC sp_addrolemember N'RoleUser', N'App_AAD_Register_Name'。
完成所有这些步骤后,您将能够使用令牌连接到DB。
这些步骤对我有效。

1
我正在尝试从Azure自动化中的PowerShell脚本进行连接。我查找了Azure自动化RunAs用户并将其添加,但仍然无法解决相同的匿名登录错误。我阅读的每个其他指南都说您需要将服务主体添加到Windows组,然后将Windows组添加到SQL Azure数据库中。 - Nick.McDermaid
这对我来说完美地运作了,并允许我使用证书进行身份验证。另一个解决方案也可以(在我的开发PC上),但没有给我任何控制使用哪些凭据的方式。 - lethek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接