C#中的Azure托管服务身份以连接到Azure SQL Server

时间:2018-10-10 20:52:28

标签: c# azure azure-sql-database azure-msi

我正在运行一个Microsoft文档教程,该教程有关如何设置对Azure SQL的MSI访问。本文: https://docs.microsoft.com/en-gb/azure/app-service/app-service-web-tutorial-connect-msi

我从我的Azure Web配置管理器成功获取了连接字符串

public MyDatabaseContext(SqlConnection conn) : base(conn, true)
{
  conn.ConnectionString = WebConfigurationManager.ConnectionStrings["dbConnectionName"].ConnectionString;

  // DataSource != LocalDB means app is running in Azure with the SQLDB connection string you configured
  if (conn.DataSource != "(localdb)\\MSSQLLocalDB")
            conn.AccessToken = (new AzureServiceTokenProvider()).GetAccessTokenAsync("https://database.windows.net/").Result;

  Database.SetInitializer<MyDatabaseContext>(null);
}

我在控制器中使用

private MyDatabaseContext db = new MyDatabaseContext(new SqlConnection());

当我最终拨打电话时,例如:

var sample = (from c in _context.Customer where c.Abbreviation == abbrev.Trim() select c).FirstOrDefault();

我收到错误System.Data.Entity.Core.EntityException:“底层提供程序在打开时失败。” “ SqlException:用户'NT AUTHORITY \ ANONYMOUS LOGON'登录失败。”

即使我(https://docs.microsoft.com/en-gb/azure/app-service/app-service-managed-service-identity#obtaining-tokens-for-azure-resources)也会发生这种情况

using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.Azure.KeyVault;
// ...
var azureServiceTokenProvider = new AzureServiceTokenProvider();
string accessToken = await 
azureServiceTokenProvider.GetAccessTokenAsync("https://vault.azure.net");
// OR
var kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));

并在我的SqlConnection中填充适当的访问令牌。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

对于感兴趣的任何人,我认为这个问题都是一个延迟。

我跑了一次;

tooltip: {
  split: false,
  shared: true
},

并添加了一个连接字符串;

az webapp identity poweshell command 

可以,但是花了一些时间