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

Mik*_*ike 2 c# database authentication azure azure-webjobs

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

我想知道这里有没有人这样做过,我发现.NET的天蓝色管理库有数据库创建的例子,但我坚持授权,因为这将从后端进程完成?

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

这时我真的没有任何代码更像是想法,这就是为什么我要求帮助:)

我假设我会使用这样的东西进行身份验证?

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

        // Connect to Azure
        var azure = Azure.Authenticate(credentials).WithDefaultSubscription();
Run Code Online (Sandbox Code Playgroud)

我假设我可能需要在Azure本身做一些事情来信任WebJob以获得创建新Azure数据库的权限,但这是我不确定的部分.

从PowerShell我通过让PS启动Microsoft Live登录屏幕来完成身份验证,但这对于没有UI的WebJob来说是不实际的.

希望这是有道理的,有人可以为我阐明它吗?

juu*_*nas 7

你走在正确的轨道上.

您必须为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门户#创建-AN-Azure的主动目录的应用程序

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

所以:

  1. 像在文档中一样创建应用程序
  2. 像在文档中一样向应用程序添加密钥(客户端密钥)
  3. 复制客户端ID和密码+租户ID,因为稍后在使用API​​时将需要它们
  4. 通过Portal为服务主体分配角色/角色
  5. 你现在可以编写使用你所获得的凭证的程序(这个库非常好: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.