Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 使用访问令牌与SQL Azure DB的实体框架连接_Entity Framework_Azure Active Directory_Adal - Fatal编程技术网

Entity framework 使用访问令牌与SQL Azure DB的实体框架连接

Entity framework 使用访问令牌与SQL Azure DB的实体框架连接,entity-framework,azure-active-directory,adal,Entity Framework,Azure Active Directory,Adal,我们有一个连接到SQLAzure数据库的web应用程序。我已使用应用程序ID和证书配置了我的应用程序。我们希望使用访问令牌方法连接到SQL Server,根据下面的链接,通过令牌方法连接到SQL Server不是一种可靠的方法。任何推荐的连接方式,而不是用户ID和密码 有人能告诉我他们是否使用entity framework实现了基于SQL Azure DB AAD令牌的身份验证,以及这是正确的连接方式。根据您的描述,我遵循了关于对Azure SQL数据库使用AAD身份验证的说明 正如前面提到

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


有人能告诉我他们是否使用entity framework实现了基于SQL Azure DB AAD令牌的身份验证,以及这是正确的连接方式。

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

正如前面提到的有关Azure AD令牌身份验证的内容一样:

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

  • 在Azure Active Directory中注册应用程序,并获取代码的客户端id
  • 创建代表应用程序的数据库用户。(前面在步骤6中完成。)
  • 在运行应用程序的客户端计算机上创建证书
  • 将证书添加为应用程序的密钥
然后,我按照本文中的说明开始使用此功能,并且它按照预期工作

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

基于上面的代码示例,我添加了使用实体框架实现SQLAzure 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; }
}
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();
    }
}
结果

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; }
}

注意:通过外部提供商的
创建用户[mytokentest]为您的应用程序主体包含的数据库用户没有访问您的数据库的任何权限。您需要为此用户授予权限,有关更多详细信息,请参阅此


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

您解决了这个问题了吗,这个问题有更新吗?您不需要处理令牌刷新,令牌工厂。GetAccessToken()会处理这个问题。