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

Entity Framework connection to SQL Azure DB using access token

我们有连接到 SQL Azure 数据库的 Web 应用程序。我已经使用应用程序 ID 和证书配置了我的应用程序。我们想使用访问令牌方法连接到 SQL 服务器,根据下面 link,通过令牌方法连接到 SQL 服务器不是可靠的方法。任何推荐的连接方式,而不是用户 ID 和密码。

任何人都可以告诉我他们是否已经使用 entity framework 实施了 SQL 基于 Azure DB AAD 令牌的身份验证,并且它是正确的连接方式吗?

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

正如这个 tutorial 提到的 Azure AD 令牌身份验证:

This authentication method allows middle-tier services to connect to Azure SQL Database or Azure SQL Data Warehouse by obtaining a token from Azure Active Directory (AAD). It enables sophisticated scenarios including certificate-based authentication.You must complete four basic steps to use Azure AD token authentication:

  • Register your application with Azure Active Directory and get the client id for your code.
  • Create a database user representing the application. (Completed earlier in step 6.)
  • Create a certificate on the client computer runs the application.
  • Add the certificate as a key for your application.

然后我按照 code sample in this blog 开始使用此功能,它按预期工作。

Can anyone let me know if they have implemented SQL Azure DB AAD token based authentication using entity framework and is it right way for connecting.

基于上面的代码示例,我添加了 EntityFramework 6.1.3 以使用 entity framework 实现 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();
    }
}

结果

注意: 通过 CREATE USER [mytokentest] FROM EXTERNAL PROVIDER 为您的应用程序主体包含的数据库用户没有访问您的数据库的任何权限。您需要为该用户授予权限,更多详情请参考issue.

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