用 C# 编写的 WebJob 可以创建 Azure 数据库吗?

Can a WebJob written in C# create a Azure database?

这周我一直在玩 PowerShell,为我们的部署创建一个新的 Azure 环境,最后一部分调用用 C# 编写的 WebJob 来接受来自队列的消息并创建一个新数据库并创建根据需要结构。

我想知道这里是否有人以前这样做过,我找到了 .NET 的 azure 管理库,其中有数据库创建的示例,但我坚持授权,因为这将通过后端进程完成?

我是否可以在我的 Azure 环境中创建信任以允许我的 WebJob 连接 Azure(尽管该应用程序 运行 在同一订阅中)并创建一个新数据库?

此时我真的没有任何代码更像是想法,这就是我寻求帮助的原因:)

我假设我会使用类似这样的方法进行身份验证?

var credentials = SdkContext.AzureCredentialsFactory.FromServicePrincipal(
            "clientid",
            "clientsecret",
            "tenantid",
            AzureEnvironment.AzureGlobalCloud);

        // Connect to Azure
        var azure = Azure.Authenticate(credentials).WithDefaultSubscription();

我想我可能需要在 Azure 本身做一些事情来信任 WebJob 有权创建新的 Azure 数据库,但这是我不确定的部分。

在 PowerShell 中,我通过让 PS 调出 Microsoft Live 登录屏幕来完成身份验证,但这对于没有 UI.

的 WebJob 来说并不实用

希望这是有道理的,有人可以帮我解释一下吗?

你走在正确的轨道上。

您必须为 WebJob 创建一个 服务主体 ,这实际上是应用程序的凭据。您将获得它的客户端 ID 和密码(即应用程序的用户名和密码),它可用于针对 Azure Active Directory 进行身份验证,并获取访问令牌以调用 API(例如 Azure 的管理 API)。

您可以在此处查看如何在 Azure AD 中创建应用程序(它还会创建服务主体):https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-service-principal-portal#create-an-azure-active-directory-application

然后您可以在任何 resource/resource group/subscription 上为服务主体分配一个角色。由于您需要它能够创建资源,因此它至少应该是资源组的 Contributor。如果您还需要为

创建一个资源组

所以:

  1. 按照文档创建应用程序
  2. 按照文档
  3. 向应用添加一个密钥(客户端密钥)
  4. 复制客户端 ID 和密码 + 租户 ID,因为您稍后在使用 API 时需要它们
  5. 通过门户为服务主体分配 role/roles
  6. 您现在可以编写使用您获得的凭据的程序(这个库非常好:https://docs.microsoft.com/en-us/dotnet/azure/dotnet-sdk-azure-concepts?view=azure-dotnet

关于存储秘密的简短说明:

您应该小心客户端密码,它本质上是一个密码。 至少,您应该将其存储在 Web App 的 App Settings 中,而不是代码中。更好的方法是将 Azure Key Vault 与 Azure AD 托管服务标识一起使用:https://joonasw.net/view/azure-ad-managed-service-identity.