【问题标题】:How to query users associated to a specific web application in Azure?如何在 Azure 中查询与特定 Web 应用程序关联的用户?
【发布时间】:2017-12-28 17:54:44
【问题描述】:

我有一个托管在 Azure 上的应用程序(Web 应用程序),它使用 Azure Active Directory 来管理用户。

我刚刚弄清楚如何使用这个查询来查询用户:

https://graph.windows.net/mytenantid/users?api-version=1.5

但它给我带来了目录中的所有用户,而不仅仅是与我的应用程序相关联的用户。

我需要做的是仅从该特定应用程序查询用户,而不是目录中的所有用户。有没有办法做到这一点?

【问题讨论】:

  • 还有一点我要说清楚:通常情况下,在Azure AD启用身份验证后,所有用户都可以登录WebApp,你如何指定一些不同的用户到Web应用程序?

标签: asp.net azure asp.net-core azure-active-directory microsoft-graph-api


【解决方案1】:

如果这些用户已被分配到您的应用程序(使用记录在案的过程 here)或已单独同意(与代表整个租户同意的管理员相反),您可以使用ServicePrincipal 上与您的应用程序相关的 appRoleAssignedTo 导航属性。

该导航属性将为您提供AppRoleAssignments 的列表,它代表已分配给此应用的所有实体。

这些实体中的每一个(在您的情况下是用户,但它们也可以是组或其他 ServicePrincipals,将在 princiaplType 属性中指示)将在 principalId 属性中表示。

【讨论】:

  • 非常感谢,伙计!它成功了! (客户已取消此请求但改变了主意 XD)
【解决方案2】:

所以..我是这样做的:

    var url = $"https://graph.windows.ne/{tenantId}/servicePrincipals/{objectID}/appRoleAssignedTo?api-version=1.5";
    var content = await ExecuteRequestAsync(url);
    var userPermissionsList = ConvertToEntityList<UserPermissionModel>(content);

ExecuteRequestAsync 方法:

        public async Task<string> ExecuteRequestAsync(string url)
        {
            try
            {
                AuthenticationContext authenticationContext = new AuthenticationContext(authString, false);
                ClientCredential clientCred = new ClientCredential(clientID, secretKey);
                AuthenticationResult authenticationResult;

                authenticationResult = await authenticationContext.AcquireTokenAsync(resAzureGraphAPI, clientCred);
                var client = new HttpClient();

                var request = new HttpRequestMessage(System.Net.Http.HttpMethod.Get, url);
                request.Headers.Authorization =
                    new AuthenticationHeaderValue("Bearer", authenticationResult.AccessToken);
                var response = await client.SendAsync(request);
                var content = await response.Content.ReadAsStringAsync();

                return content;
            }
            catch (Exception)
            {

                throw;
            }
        }

然后我用下面的方法对内容进行了序列化:

        private List<T> ConvertToEntityList<T>(string content)
        {
            List<T> entityList = new List<T>();

            // Create JavaScriptSerializer instance.
            JObject jsonObj = JsonConvert.DeserializeObject(content) as JObject;
            var propperties = jsonObj.Properties().ToList();

            var entitiesTemp = JsonConvert.DeserializeObject(propperties[1].Value.ToString());// as JObject;
            entityList = JsonConvert.DeserializeObject<List<T>>(entitiesTemp.ToString());

            return entityList;
        }

【讨论】:

    猜你喜欢
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 2020-05-15
    • 2018-01-09
    相关资源
    最近更新 更多