使用访问令牌连接到 SQL Azure 数据库的 Entity Framework

6
我们有一个连接到SQL Azure数据库的Web应用程序。我已经使用应用程序ID和证书配置了我的应用程序。我们想利用访问令牌方法连接到SQL Server,但根据以下链接,通过令牌方法连接到SQL Server并不是一种可靠的方法。有没有其他推荐的连接方式,而不是使用用户ID和密码。 如何在Azure网站中使用Azure Active Directory连接Azure SQL? 有人能告诉我他们是否已经使用实体框架实现了基于AAD令牌的SQL Azure DB身份验证,并且这是连接的正确方法吗?

你解决了这个问题吗?对于这个问题有任何更新吗? - Bruce Chen
1个回答

5
根据您的描述,我按照使用Azure SQL Database的AAD身份验证的教程进行了操作。
正如这个教程所提到的那样,关于Azure AD token authentication
此身份验证方法允许中间层服务通过从Azure Active Directory(AAD)获取令牌来连接Azure SQL Database或Azure SQL Data Warehouse。它支持包括基于证书的身份验证在内的复杂场景。您必须完成四个基本步骤才能使用Azure AD token authentication:
1. 使用Azure Active Directory注册您的应用程序,并获取代码的客户端ID。 2. 创建一个代表应用程序的数据库用户。(在第6步中已完成。) 3. 在运行应用程序的客户端计算机上创建一个证书。 4. 将证书添加为应用程序的密钥。
然后,我遵循了代码示例博客中介绍的方式来开始使用此功能,并且它按预期工作。
有人可以告诉我是否已经使用实体框架实现了基于SQL Azure DB AAD令牌的身份验证,这是连接的正确方式吗?
根据上述代码示例,我添加了EntityFramework 6.1.3来使用实体框架实现了SQL Azure DB AAD令牌身份验证。经过多次尝试,我成功地使其正常工作。以下是一些详细信息,您可以参考它们。 DbContext
public class BruceDbContext : DbContext
{
    public BruceDbContext()
        : base("name=defaultConnectionString")
    { }

    public BruceDbContext(SqlConnection con) : base(con, true)
    {
        Database.SetInitializer<BruceDbContext>(null);
    }

    public virtual DbSet<User> Users { get; set; }
}

数据模型
[Table("Users")]
public class User
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long Id { get; set; }
    [StringLength(50)]
    public string UserName { get; set; }
    public DateTime CreateTime { get; set; }
}

Program.cs

class Program
{
    static void Main()
    {
        SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
        builder["Data Source"] = "brucesqlserver.database.windows.net";
        builder["Initial Catalog"] = "brucedb";
        builder["Connect Timeout"] = 30;

        string accessToken = TokenFactory.GetAccessToken();
        if (accessToken == null)
        {
            Console.WriteLine("Fail to acuire the token to the database.");
        }
        using (SqlConnection connection = new SqlConnection(builder.ConnectionString))
        {
            try
            {   
                connection.AccessToken = accessToken;
                //working with EF
                using (var model = new BruceDbContext(connection))
                {
                   var users= model.Users.ToList();
                    Console.WriteLine($"Results:{Environment.NewLine}{JsonConvert.SerializeObject(users)}");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
        Console.WriteLine("Please press any key to stop");
        Console.ReadKey();
    }
}

结果

在此输入图片描述

注意:通过CREATE USER [mytokentest] FROM EXTERNAL PROVIDER创建的数据库用户没有访问数据库的权限。您需要为该用户授予权限,有关详细信息,请参阅此问题

此外,在构建DbContext实例时,您需要使用有效的AccessToken实现SqlConnection实例。据我所知,当令牌过期时,您需要处理令牌刷新。


2
{btsdaf} - I Stand With Russia
什么是TokenFactory类? - Jay

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