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

时间:2017-03-30 23:41:30

标签: entity-framework azure-active-directory adal

我们有连接到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 个答案:

答案 0 :(得分:4)

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

正如此tutorial提到的 Azure AD令牌身份验证

  

此身份验证方法允许中间层服务通过从Azure Active Directory(AAD)获取令牌来连接到Azure SQL数据库或Azure SQL数据仓库。它支持复杂的方案,包括基于证书的身份验证。您必须完成四个基本步骤才能使用Azure AD令牌身份验证:

     
      
  • 使用Azure Active Directory注册您的应用程序,并获取代码的客户端ID。
  •   
  • 创建表示应用程序的数据库用户。 (在步骤6中提前完成。)
  •   
  • 在客户端计算机上创建证书运行应用程序。
  •   
  • 将证书添加为应用程序的密钥。
  •   

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

  

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

<强>结果

enter image description here

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

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