【问题标题】:DBMigrator fails to read accesstoken in ef6 codefirst - SQL ConnectionDBMigrator 无法首先读取 ef6 代码中的访问令牌 - SQL 连接
【发布时间】:2017-10-01 01:55:39
【问题描述】:

我有一个带有 ef6 代码的 WebAPI,首先设置和工作。在应用启动中,我们有dbmigrator.Update(),它将任何待处理的迁移应用到数据库。

更改连接字符串以删除用户名和密码并改为提供访问令牌后,dbmigrator.Update() 失败并出现错误:

用户“”登录失败

如何确保 dbmigrator 使用 Azure SQL 访问令牌而不是连接字符串中的用户名/密码?

编辑 1:

对 dbcontext 构造函数所做的更改是从

DbContext() : base("nameofConnString"){}

DbContext() : base(GetSQLConn(), true) 
{
     Database.SetInitializer<DbContext>(null);
}

使用GetSQLConn(),我正在检索一个没有 uname/pwd 的连接并将 accesstoken 附加到它并返回该连接!

编辑 2:

    private static SqlConnection GetSQLConn()
    {
        var accessToken = TokenFactory.AcquireToken();
        var connString = ConfigurationManager.ConnectionStrings["SQLConnectionString"].ConnectionString;

        var conn = new SqlConnection(connString)
        {
            AccessToken = accessToken,
        };

        return conn;
    }

【问题讨论】:

  • 是的,先生,我已经浏览了链接,事实上,这是我继续使用 sql 访问令牌更改的灵感。但是 DbMigrator 仍然失败。我会在那里请求更多信息,但我没有足够的声誉来评论现有帖子。
  • 能分享一下GetSQLConn方法代码吗?
  • @ChetanRanpariya 添加了用于 GetSQLConn 的代码
  • @ChetanRanpariya 是的,实际上 dbcontext 适用于我所有表上的 CRUD 操作,只是这个迁移器不起作用!

标签: c# sql entity-framework azure asp.net-web-api


【解决方案1】:

如何确保 dbmigrator 使用 Azure SQL 访问令牌而不是连接字符串中的用户名/密码?

实际上 dbcontext 适用于我所有表上的 CRUD 操作,只是这个迁移器不起作用!

根据您的评论,您似乎没有警报表的权限。如果您没有为创建的用户授予相应的权限。 请尝试向创建的用户授予权限。更多db角色详情请参考Database-Level Roles

EXEC sp_addrolemember N'db_owner', N'your-user-name'

我也关注你提到的SO thread。如果我将用户添加到 do_owner,我会使用 Alter Table 对其进行测试,它在我这边可以正常工作。以下是我的详细步骤。

1.Registry an Azure AD Application

2.为您的 Azure SQL 服务器配置 Azure Active Directory 管理员,更多详细信息请参考tutorials

3.为Azure SQL创建用户并授予相应权限。

CREATE USER [RegistryAppName] FROM  EXTERNAL PROVIDER 

EXEC sp_addrolemember N'db_owner', 'RegistryAppName'

4.更改demo code并按预期运行。

 SqlConnectionStringBuilder builder =
         new SqlConnectionStringBuilder
             {
               ["Data Source"] = "azureServername.database.windows.net",
                    ["Initial Catalog"] = "databaseName",
                    ["Connect Timeout"] = 30
             };
    // replace with your server name
    // replace with your database name

    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;
               connection.Open();

               var commentText = "ALTER TABLE AccountRec ADD newColumn varchar(10) ";
               SqlCommand sqlCommand = new SqlCommand(commentText, connection);
                   
               Console.WriteLine("Executed Result:" + sqlCommand.ExecuteNonQuery());
           }
         catch (Exception ex)
         {
                Console.WriteLine(ex.Message);
         }
      }
      Console.WriteLine("Please press any key to stop");
      Console.ReadKey();

【讨论】:

  • 列出的所有步骤都已执行并正在运行。我已经提到数据库操作与 SQL 查询和 dbcontext 一起工作。代码优先迁移的目的 - DbMigrator 是从检查数据库是否存在开始,通过连接到主数据库(应用程序也添加到主数据库并赋予 dbMabager 角色)。然后一直到最新的迁移以确保数据库是最新的。这是我想保持不变的东西。
  • 这个答案只告诉我我已经知道和已经做过的事情。我正在专门寻找一种使 Entity DbMigrator 与访问令牌机制一起工作的方法——该机制未在任何地方定义。
  • 你给创建的用户授予了什么权限?
  • 这是我创建的应用资源,它被授予数据库的db_owner,在服务器的主数据库级别,它被授予db_manager。
  • 这个问题肯定与权限无关,我已经检查了 dbMigrator 中的所有公共和私有属性,并且没有在其中看到访问令牌,我只是要找到没有用户名的连接字符串/密码。因此我的问题仍然存在,如何让 dbMIgrator 通过连接读取访问令牌?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
相关资源
最近更新 更多