【问题标题】:Can a WebJob written in C# create a Azure database?用 C# 编写的 WebJob 可以创建 Azure 数据库吗?
【发布时间】:2017-11-04 03:06:37
【问题描述】:

这周我一直在玩 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 实时登录屏幕来完成身份验证,但这对于没有 UI 的 WebJob 来说是不实用的。

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

【问题讨论】:

  • 你能把你的问题陈述更具体一点吗?您是否收到任何错误消息?你能发布你的代码吗?
  • 尽可能多地更新问题,感谢您的评论。
  • 为什么不在具有创建dbs权限的webjob主机(在Azure中)的web.config中存储一个秘密连接字符串,然后只使用EF代码?

标签: c# database azure authentication azure-webjobs


【解决方案1】:

你在正确的轨道上。

您必须为 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

然后,您可以为任何资源/资源组/订阅上的服务主体分配角色。由于您需要它来创建资源,因此它至少应该是资源组上的 Contributor。如果还需要为

创建资源组

所以:

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

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

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

【讨论】:

  • 为什么不使用托管服务标识 (docs.microsoft.com/en-us/azure/active-directory/msi-overview) 而不是在应用程序中使用客户端 ID 和密码?
  • 好吧,我确实在 MSI 上写了一篇完整的博文:joonasw.net/view/azure-ad-managed-service-identity。我认为存储秘密的方式不是 OP 的问题。不过,我同意使用 MSI 是个好主意。我只是不想让答案过于冗长和复杂。我将添加一个关于 MSI 的小注释。
  • 感谢大家的意见,我已经关注了你的链接 Juunas 并让它工作了。一旦我证明了这个概念并让它发挥作用,我也会看看 MSI,总是在最后期限紧迫,但会看看它是否是我以后可以添加的东西。
猜你喜欢
  • 1970-01-01
  • 2013-04-07
  • 2019-06-24
  • 1970-01-01
  • 2019-06-23
  • 2014-10-06
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
相关资源
最近更新 更多