首页 文章

使用访问令牌将实体框架连接到SQL Azure DB

提问于
浏览
2

我们有连接到SQL Azure DB的Web应用程序 . 我已使用应用程序ID和证书配置了我的应用程序 . 我们希望使用Access Token Approach连接到SQL Server,如下面的链接,通过令牌方法连接到SQL Server不是一种可靠的方法 . 任何推荐的连接方式,而不是用户ID和密码 .

Connect to Azure SQL using Azure Active Directory from an Azure Website?

任何人都可以告诉我他们是否已经使用实体框架实现了基于SQL Azure DB AAD令牌的身份验证,这是正确的连接方式 .

1 回答

  • 3

    根据您的描述,我遵循tutorial关于使用Azure SQL数据库的AAD身份验证 .

    正如tutorial提到 Azure AD token authentication

    此身份验证方法允许中间层服务通过从Azure Active Directory(AAD)获取令牌来连接到Azure SQL数据库或Azure SQL数据仓库 . 它支持复杂的方案,包括基于证书的身份验证 . 您必须完成四个基本步骤才能使用Azure AD令牌身份验证:使用Azure Active Directory注册应用程序并获取代码的客户端ID . 创建表示应用程序的数据库用户 . (在步骤6中较早完成 . )在客户端计算机上创建证书以运行该应用程序 . 将证书添加为应用程序的密钥 .

    然后我按照blog中的code sample开始使用此功能,它按预期工作 .

    如果他们使用实体框架实现了基于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; }
    }
    

    DataModel

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

    Result

    enter image description here

    Note: 通过 CREATE USER [mytokentest] FROM EXTERNAL PROVIDER 为您的应用程序主体包含的数据库用户没有访问数据库的任何权限 . 您需要为此用户授予权限,有关详细信息,请参阅此issue .

    此外,在构造 DbContext 实例时,需要使用有效的 AccessToken 实现 SqlConnection 实例 . AFAIK,您需要在令牌过期时处理令牌刷新 .

相关问题