无法将数据库从具有 EF 核心和 AAD 授权的代码迁移到 SQL 服务器

如何解决无法将数据库从具有 EF 核心和 AAD 授权的代码迁移到 SQL 服务器

背景

我正在尝试在我的 sql 服务器中授权我的 WebApp。 WebApp 和 sql 服务器都托管在 Azure 上。 我使用 Net core 3.1 和 EF core 3.1。我的网络应用程序托管在 linux 机器上。我还必须实现能够从 API 端点迁移数据库功能

复制 tutorial I used

  1. 在我的 Web 应用程序中,我有 API 端点:POST api/migrate,它负责迁移我的数据库
    _dbContext.Database.Migrate();
  1. 在我的网络应用中,我启用了托管服务标识。可以从 Azure 门户完成,但我已经在我网站的 ARM 模板中完成了:
    "identity": {
      "type": "SystemAssigned"
    },
  1. 在我的 AAD 中,我创建了名为 MSI-sqlSERVER-ACCESSGROUP 的组(类型为 Security)。我将我的 Web 应用程序作为服务主体添加到该组。我可以这样做,因为我之前启用了 MSI。

  2. 在我的业务数据库中,我添加了名为 MSI-sqlSERVER-ACCESSGROUP 的 Contained 用户

    CREATE USER MSI-sqlSERVER-ACCESSGROUP FROM EXTERNAL PROVIDER
    ALTER ROLE db_datareader ADD MEMBER MSI-sqlSERVER-ACCESSGROUP
    ALTER ROLE db_datawriter ADD MEMBER MSI-sqlSERVER-ACCESSGROUP
    ALTER ROLE db_ddladmin ADD MEMBER MSI-sqlSERVER-ACCESSGROUP
  1. 我在 dbContext 构造函数中将 Accesstoken 添加数据库连接:
    var conn = (sqlConnection)_dbContext.Database.GetDbConnection();
    conn.Accesstoken = (new AzureServicetokenProvider()).GetAccesstokenAsync("https://database.windows.net/").Result;

问题

我可以通过 dbContext 访问数据库数据。不幸的是,我无法迁移我的数据库。我的端点返回 HTTP 500。日志说:

指定的架构名称“{appId}@{AAD 租户 ID}”不存在或您无权使用它。

尝试过

我已将 db_securityadmindb_accessadmindb_owner 提供给我的用户,但没有帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?