如何阅读Azure Active Directory的域

问题描述 投票:10回答:2

我创建了新的Azure帐户,并尝试使用以下代码在其中自动部署应用程序:

var app = azure.AccessManagement.ActiveDirectoryApplications
.Define(appName)
.WithSignOnUrl(appSignOnUrl)
.WithAvailableToOtherTenants(true)
.WithIdentifierUrl(identifierUrl)
.DefinePasswordCredential(username)
.WithPasswordValue(password)
.WithDuration()
.Attach();
.CreateAsync();

如果identifierUrl被硬编码为Azure Active Directory名称,则它可以工作。

如何从Azure读取identifierUrl(Azure Active Directory域名)?

我可以在门户网站中看到这个值,但我找不到一个API来读取它。

AD domain value.

c# azure-active-directory
2个回答
2
投票

用于获取与Azure AD租户关联的域名的代码

请注意,您的租户可能有多个域名。您在问题的屏幕截图中显示的那个是在创建Azure AD时分配给您的租户的第一个,并且已经过验证,因为它使用.onmicrosoft.com。 Link

您始终可以将其他域与Azure AD租户关联,以便证明其所有权并对其进行验证。我稍后会谈到这一点,但首先是相关代码。在您的情况下,您可能只会返回一个默认域名。

这是我使用Azure AD租户快速编写和测试的工作代码。由于您已经在使用流畅的API来创建应用程序,因此这应该非常相似。

我使用了一个带有简单控制台应用程序的.NET和C#,但我想其他任何库的代码都非常相似。

using System;
using Microsoft.Azure.Management.Fluent;
using Microsoft.Azure.Management.Graph.RBAC.Fluent;
using Microsoft.Azure.Management.ResourceManager.Fluent;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            // whatever method you're using already for Authentication (like through file or with credentials or with cert
            // same can be used to get AzureCredentials as well, just change the FromFile to FromServicePrincipal if required
            IAzure azure = Azure.Authenticate("my.azureauth").WithDefaultSubscription();
            var creds = SdkContext.AzureCredentialsFactory.FromFile("my.azureauth");

            IGraphRbacManager graphRbacManager = GraphRbacManager.Authenticate(creds, "<your tenant Guid>");    
            var domains = graphRbacManager.Inner.Domains.ListAsync().GetAwaiter().GetResult();

            string defaultDomain = string.Empty;
            foreach (var domain in domains)
            {  
                Console.WriteLine(domain.Name);
                if (domain.IsDefault.HasValue && domain.IsDefault.Value == true)
                    defaultDomain = domain.Name;                
                    // not breaking out of loop on purpose, just to print all domain names if multiple are there.
            }

            string identiferUri = string.Format("https://{0}/myuniqueapp1", defaultDomain);
            var app = azure.AccessManagement.ActiveDirectoryApplications
                .Define("My Unique App 1")
                .WithSignOnUrl("https://myuniqueapp1.azurewebsites.net")
                .WithAvailableToOtherTenants(true)
                .WithIdentifierUrl(identiferUri)
                .DefinePasswordCredential("string")
                .WithPasswordValue("string")
                .WithDuration(new TimeSpan(365,0,0,0))
                .Attach()
                .CreateAsync();

            Console.ReadLine();
        }        
    }
}

identifierUris以及与Azure AD租户的已验证域的关系

在您创建.WithIdentifierUrl(identifierUrl)的应用程序的代码中,它会进入并将提供的Url添加到应用程序清单的identifierUris集合中。在Azure门户中,您将看到应用程序注册的属性>应用程序ID URI中指定的此值。您还可以编辑清单并直接在门户中查看清单。

该值唯一标识您的应用程序。对于单租户应用程序,您可以将其设置为Azure AD中任何其他应用程序未使用的任何唯一值,但对于多租户应用程序,它必须全局实施,因此在使用主机的URL时存在限制name与Azure AD租户的已验证域之一匹配。由于您使用的是.WithAvailableToOtherTenants(true),因此这个概念与您相关。

以下是Microsoft Docs上的几个关于此的链接 -

需要权限

希望您已经涵盖了此步骤,因为您需要创建应用程序的权限,但是如果您不需要或未来其他任何人阅读此内容,因为代码正在从Azure AD读取信息并在Azure AD中创建新应用程序,用于获取AzureCredentials以运行此代码的服务主体应该具有足够的权限。

转到您的服务主体的Azure AD>应用程序注册>应用程序注册(您可以通过应用程序ID找到它,它将与您的服务主体具有相同的应用程序ID)>转到所需权限>添加Windows Azure Active Directory并提供相应的应用程序您的代码所需的权限。

enter image description here

最后,请确保执行“授予权限”,因为此处的所有应用程序权限都需要管理员同意。


3
投票

您似乎只是想读取租户名称。您可以通过致电获取您登录的租户的名称

https://management.azure.com/tenants?$skiptoken={skiptoken}&api-version={api-version}

有关详细信息,请参阅this page。这将为您提供您授权的所有租户的列表。

© www.soinside.com 2019 - 2024. All rights reserved.