从.NET应用程序调用Azure资源图API

laawzig2  于 2022-11-17  发布在  .NET
关注(0)|答案(1)|浏览(235)

我正在尝试创作一个应用程序,该应用程序允许用户从我的应用程序中查询其Azure订阅中的网站列表。我不希望在我的应用程序中存储他们的凭据(他们也不应该希望我这样做),相反,我会要求他们从Azure AD示例中注册应用程序,然后让他们存储在我的应用程序中生成的ClientID和TenantID。我会向他们提供一组说明,而且他们可以在任何时候关闭。他们需要感觉舒服这样做,就像我会。
我试图遵循这篇文章的情节:Using Azure resource graph with .net SDK
这让我非常接近,但当我运行应用时,我从Azure资源图收到“禁止”响应,因此调用通过,但被拒绝。我还尝试使用自己的Azure门户添加各种API权限进行测试。文章指出,我需要使用以下内容创建服务主体:
az ad sp为rbac“MyApp”创建--角色贡献者--sdk-auth
我还没做呢。
所以我的问题是:

  • 这是我的问题吗?
  • 我是否需要要求我的用户创建一个服务主体,如果需要,在上面的示例中,“MyApp”变量的值是什么?
  • 有没有更好的方法来实现这一点,对用户的要求更低?

我感谢任何人可以提供任何指导或文章转介。
非常感谢....

qyyhg6bp

qyyhg6bp1#

如果要使用服务主体调用Azure资源图Rest API,则必须将Azure RABC Role分配给sp。因此,必须运行以下命令

# it will create a service pricipal and assign a contributor rolen to the sp
az ad sp create-for-rbac -n "MyApp"  --scope "/subscriptions/<subscription id>" --sdk-auth

 
# if you have a service principal, please run the following script
az ad sp list --display-name "{name}" --query [].objectId --output tsv
az role assignment create --assignee <sp object id> --role "Contributor " --scope "/subscriptions/<subscription id>"

同时,运行示例的详细步骤如下
1.运行以下脚本。

az login
az ad sp create-for-rbac -n "MyApp"  --scope "/subscriptions/<subscription id>" --sdk-auth

1.配置代码。请注意,如果要调用不同订阅中的资源,则需要通过在步骤1中更改范围值来创建不同的服务主体

public  async static Task Test() {

            CustomLoginCredentials creds = new CustomLoginCredentials();

            var resourceGraphClient = new ResourceGraphClient(creds);

            var queryReq = new QueryRequest {

                Subscriptions = new List<string> { "<the subscriptionId you copy>" },
                Query = "where type == 'microsoft.web/sites'"

            };
            var result = await resourceGraphClient.ResourcesAsync(queryReq);
            Console.WriteLine(result.Count);
        }

class CustomLoginCredentials : ServiceClientCredentials {
        private static string tenantId = "<the tenantId you copy >";
        private static string clientId = "<the clientId you copy>";
        private static string cert = "<the clientSecre tyou copy>";
        private string AuthenticationToken { get; set; }
        public override void InitializeServiceClient<T>(ServiceClient<T> client)
        {
            var authenticationContext =
                new AuthenticationContext("https://login.microsoftonline.com/"+tenantId);
            var credential = new ClientCredential(clientId: clientId, clientSecret: cert);

            var result = authenticationContext.AcquireTokenAsync(resource: "https://management.azure.com/",
                clientCredential: credential).Result;

            if (result == null)
            {
                throw new InvalidOperationException("Failed to obtain the JWT token");
            }

            AuthenticationToken = result.AccessToken;
        }
        public override async Task ProcessHttpRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            if (request == null)
            {
                throw new ArgumentNullException("request");
            }

            if (AuthenticationToken == null)
            {
                throw new InvalidOperationException("Token Provider Cannot Be Null");
            }


            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", AuthenticationToken);


            await base.ProcessHttpRequestAsync(request, cancellationToken);

        }

有关详细信息,请参阅
https://odetocode.com/blogs/scott/archive/2018/02/01/setting-up-service-principals-to-use-the-azure-management-apis.aspx
https://learn.microsoft.com/en-us/cli/azure/ad/sp?view=azure-cli-latest#az-ad-sp-create

更新

根据您的需求,我认为您可以创建一个Web应用程序来调用Azure资源图API。如果您这样做,您可以提供Web应用程序的URL,然后您的客户可以登录您的应用程序并自行调用API。
1.注册Azure AD Web应用程序

2.配置权限

1.创建客户端密码

1.配置代码。请参考sample

相关问题