DBMigrator无法在ef6 codefirst - SQL Connection中读取accesstoken

时间:2017-10-01 01:55:39

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

我有一个首先设置和工作的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;
    }

1 个答案:

答案 0 :(得分:0)

  

如何确保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

enter image description here

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

CREATE USER [RegistryAppName] FROM  EXTERNAL PROVIDER 

EXEC sp_addrolemember N'db_owner', 'RegistryAppName'

enter image description here

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();