【问题标题】:Azure AD Graph - AppRole Creation using Application Credential FlowAzure AD Graph - 使用应用程序凭据流创建 AppRole
【发布时间】:2019-07-15 11:43:11
【问题描述】:

我正在使用 Azure AD Graph API 在 azure 应用程序中创建一个新角色。我正在做的是使用此代码从 azure 获取访问令牌:

ClientCredential clientCredential = new ClientCredential(clientId, clientSecret);
AuthenticationContext authenticationContext = new AuthenticationContext(aadInstance + tenantID);
AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenAsync(graphResourceID, clientCredential);
return authenticationResult.AccessToken;

并使用以下代码创建角色:

//Fetch application Data from azure AD
IApplication application = await activeDirectoryClient.Applications.GetByObjectId(RoleModel.ApplicationID).ExecuteAsync();
AppRole NewRole = new AppRole
{
    Id = CurrentRoleID,
    IsEnabled = true,
    AllowedMemberTypes = new List<string> { "User" },
    Description = RoleModel.RoleDescription,
    DisplayName = RoleModel.RoleName,
    Value = RoleModel.RoleName
 };
 application.AppRoles.Add(NewRole as AppRole);
 await application.UpdateAsync();

我还授予了所有应用程序权限,而不是从 Azure 门户到 Microsoft Graph API 的委派权限。但我收到了这个错误:

{"odata.error":{"code":"Authorization_RequestDenied","message":{"lang":"en","value":"权限不足,无法完成操作。"},"requestId" :"e4187318-4b72-49fb-903d-42d419b65778","日期":"2019-02-21T13:45:23"}}

注意: 不过,我可以使用此访问令牌创建新用户并更新用户。

用于测试: 出于测试目的,我授予应用程序委托权限并使用客户端凭据流获取当前登录用户的访问令牌,如果登录用户有足够的目录角色,他/她可以在应用程序中创建角色,这工作正常。

问题: 那么,是否可以使用应用程序凭证流在应用程序中创建新角色?如果是这样,我错过了什么吗?

更新: 添加了 API Windows Azure Active Directory 的所有应用程序权限并授予管理员同意。

访问令牌: 从 ADzure AD 返回的访问令牌

【问题讨论】:

    标签: azure azure-active-directory azure-ad-graph-api


    【解决方案1】:

    问题:那么,是否可以在应用程序中使用 申请凭证流程?如果是这样,我错过了什么吗?

    您的一般问题的答案是,您可以使用 Azure AD Graph API 和客户端凭据流向应用程序角色添加新角色。

    工作代码

    下面给出的是工作代码(它是一个快速而肮脏的控制台应用程序,只是为了确保我在确认之前对其进行测试)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Microsoft.Azure.ActiveDirectory.GraphClient;
    using Microsoft.IdentityModel.Clients.ActiveDirectory;
    
    namespace AddAzureADApplicationRoles
    {
        class Program
        {
            static void Main(string[] args)
            {
                ActiveDirectoryClient activeDirectoryClient = new ActiveDirectoryClient(new Uri("https://graph.windows.net/{myTenantId}"),
                    async () => await GetTokenForApplication());
    
                //Fetch application Data from azure AD
                IApplication application = activeDirectoryClient.Applications.GetByObjectId("{MyAppObjectId}").ExecuteAsync().GetAwaiter().GetResult();
    
                AppRole NewRole = new AppRole
                {
                    Id = Guid.NewGuid(),
                    IsEnabled = true,
                    AllowedMemberTypes = new List<string> {"User"},
                    Description = "My Role Description..",
                    DisplayName = "My Custom Role",
                    Value = "MyCustomRole"
                };
    
                application.AppRoles.Add(NewRole as AppRole);
                application.UpdateAsync().GetAwaiter().GetResult();
            }
    
            public static async Task<string> GetTokenForApplication()
            {
                string TokenForApplication = "";
    
                    AuthenticationContext authenticationContext = new AuthenticationContext(
                        "https://login.microsoftonline.com/{MyTenantId}",
                        false);
    
                    // Configuration for OAuth client credentials 
    
                        ClientCredential clientCred = new ClientCredential("{AppId}",
                            "{AppSecret}"
                            );
                        AuthenticationResult authenticationResult =
                            await authenticationContext.AcquireTokenAsync("https://graph.windows.net", clientCred);
                        TokenForApplication = authenticationResult.AccessToken;                
    
                return TokenForApplication;
            }
        }
    }
    

    您的特定异常背后的可能问题

    我认为您已授予 Microsoft Graph API 的应用程序权限,而不是 Azure AD Graph API 所需的权限。

    在为您的应用程序设置所需权限时,请确保在选择 API 对话框中选择“Windows Azure Active Directory”而不是“Microsoft Graph”。接下来我将提供更多详细信息的屏幕截图。

    授予所需权限的步骤

    请注意,我的应用不需要“Microsoft Graph API”的任何权限。它仅具有“Windows Azure Active Directory”的应用程序权限。

    因此,请根据您的要求选择适当的应用程序权限,并确保您在最后执行“授予权限”以提供管理员同意,因为此处的所有应用程序权限都将需要管理员设置为是。

    附带说明,当您第一次创建应用注册时,它已经在 Windows Azure Active Directory 上拥有一个委派权限,因此您可能不需要再次明确选择 Windows Azure Active Directory(除非您已将其删除以用于您的app),但只需选择正确的应用程序权限并以管理员身份执行授予权限。

    【讨论】:

    • #Rohit 如您所说更新了权限。但仍然获得不足的权限。使用权限和令牌部分更新了问题。
    • 此外,使用用户凭据“UserID”和“Password”并提供适当的权限角色将在应用程序中创建而不会出现任何问题。
    • @umer 我将我的工作应用程序获得的令牌与您在编辑中发布的令牌进行了比较,两者看起来非常相似。唯一的区别是我的令牌只有一个角色“Application.ReadWrite.All”,因为我只选择了一个应用程序权限(请参阅我的答案中的屏幕截图)。如果对您来说没有太大的干扰,请尝试暂时从您的应用注册所需权限中删除所有其他权限,看看是否有任何不同。我的应用注册详细信息和代码已作为答案的一部分共享,这在我的工作结束,不知道你的情况还有什么不同
    • 很抱歉回复晚了,正忙于办公事务。昨天我授予了你提到的权限,一切似乎都运行良好。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 2019-07-17
    相关资源
    最近更新 更多