微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 使用图形api在Azure Active目录组中搜索用户

我想在我的asp.net mvc 5应用程序中使用某些具有自动完整功能的人员选择器功能搜索特定Azure AD组中的用户.这是一个演示“todo应用程序”,允许将todo分配给作为该组成员的用户.

我尝试使用Graph API直接和Azure Graph Client库,但我似乎找不到实现我想要的方法.图api允许获取组的成员,但添加过滤器“startswith”失败,因为添加过滤器时api仅返回不包含例如displayName属性的目录对象…客户端库也没有多大帮助除了提供方法但有大量开销的批处理功能之外……我将不得不获得用户的过滤结果集,而不管组成员身份(使用api中的用户列表内容),该组的所有成员然后钓鱼使用Linq正确的结果集….可以正常开发/测试,但在生产与几百用户这将是疯了…

任何想法或建议将不胜感激.谢谢!

编辑

在我的代码下面,从客户端Javascript调用搜索用户;

> AccessGroupId是用于授权用户的Azure AD组.只要
该组的成员可以访问我在自定义中处理的Web应用程序
OWin中间件
>该方法旨在用于查找该组中的用户

代码工作正常如下,只是没有应用过滤,这是与输入参数pre(来自ui中的文本框)的intentaion.我得到了访问组的所有成员.

public async Task<JsonResult> FindUser(string pre) 
{
    string AccessGroupId = ConfigurationManager.AppSettings["AccessGroupId"];
    AuthenticationContext authCtx = new AuthenticationContext(String.Format(CultureInfo.InvariantCulture,"{0}/{1}",SecurityConfiguration.LoginUrl,SecurityConfiguration.Tenant));
    ClientCredential credential = new ClientCredential(SecurityConfiguration.ClientId,SecurityConfiguration.AppKey);
    AuthenticationResult assertionCredential = await authCtx.AcquiretokenAsync(SecurityConfiguration.GraphUrl,credential);
    var accesstoken = assertionCredential.Accesstoken;

    var graphUrl = string.Format("https://graph.windows.net/mytenant.onmicrosoft.com/groups/{0}/members?api-version=2013-11-08,AccessGroupId );
    HttpClient client = new HttpClient();
    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get,graphUrl);
    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer",accesstoken);
    HttpResponseMessage response = await client.SendAsync(request);
    String responseString = await response.Content.ReadAsstringAsync();
    JObject jsonReponse = JObject.Parse(responseString);
    var l = from r in jsonReponse["value"].Children()
            select new
            {
                UserObjectId = r["objectId"].ToString(),UserPrincipalName = r["userPrincipalName"].ToString(),displayName = r["displayName"].ToString()
            };
    //users = Newtonsoft.Json.JsonConvert.DeserializeObject<List<User>>(responseString);
    return Json(l,JsonRequestBehavior.AllowGet);
}

当我向同一个api调用添加一个过滤器而不是返回成员(用户,组和/或联系人)时,它返回的目录对象(没有displayName)在上面的代码中并不真正有用,除非我愿意再次查询api(批处理)以检索用户displayname,但这对我来说看起来很多开销.

var graphUrl = string.Format("https://graph.windows.net/mytenant.onmicrosoft.com/groups/{0}/members?api-version=2013-11-08&$filter=startswith(displayName,'{1}')",AccessGroupId,pre);

解决方法

我将重点介绍两种可能的方法

>使用自定义JS库对Graph API执行请求.
您仍然需要关心accesstokens并查看ADAL.js

一个示例应用程序(在撰写本文时尚未最终确定)可在以下位置获得
AzureADSamples WebApp-GroupClaims-DotNet

看看AadPickerLibrary.js

>尝试使用ActiveDirectoryClient

它看起来像:

public async Task<JsonResult> FindUser(string pre) {

ActiveDirectoryClient client = AADHelper.GetActiveDirectoryClient();

IPagedCollection<IUser> pagedCollection = await client.Users.Where(u => u.UserPrincipalName.StartsWith(pre,StringComparison.CurrentCultureIgnoreCase)).ExecuteAsync();

if (pagedCollection != null)
{
    do
    {
        List<IUser> usersList = pagedCollection.CurrentPage.ToList();

        foreach (IUser user in usersList)
        {
            userList.Add((User)user);
        }

        pagedCollection = await pagedCollection.GetNextPageAsync();

    } while (pagedCollection != null);
}

return Json(userList,JsonRequestBehavior.AllowGet);

}

更详细的样本可在以下网站获得
AzureADSamples WebApp-GraphAPI-DotNet

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐