【问题标题】:Entity Framework connection to SQL Azure DB using access token使用访问令牌连接到 SQL Azure DB 的实体框架
【发布时间】:2018-06-08 16:36:15
【问题描述】:

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

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

谁能告诉我他们是否已经使用实体框架实现了基于 SQL Azure DB AAD 令牌的身份验证,这是正确的连接方式。

【问题讨论】:

  • 你解决了这个问题吗,这个问题有什么更新吗?

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


【解决方案1】:

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

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

此身份验证方法允许中间层服务通过从 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; }
}

数据模型

[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

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

【讨论】:

  • 您不需要处理令牌刷新,TokenFactory.GetAccessToken() 会处理。
  • 什么是 TokenFactory 类?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 2019-03-22
  • 2018-10-28
相关资源
最近更新 更多