gpt4 book ai didi

c# - 使用图形 api 在 Azure Active Directory 组中搜索用户

转载 作者:行者123 更新时间:2023-11-30 12:44:57 27 4
gpt4 key购买 nike

我希望在我的 asp.net mvc 5 应用程序中具有某种具有自动完成功能的人员选择器功能,以搜索特定 Azure AD 组中的用户。这是一个演示“待办事项应用程序”,允许将待办事项分配给属于组成员的用户。

我尝试直接使用 Graph API 和 Azure Graph 客户端库,但我似乎找不到实现我想要的方法。图形 api 允许获取组的成员,但添加过滤器“startswith”失败,因为添加过滤器时 api 仅返回不包含 DisplayName 属性等的目录对象...客户端库也没有多大帮助除了提供了一种方法但开销很大的批处理功能之外...然后我必须获得用户的过滤结果集,无论组成员身份如何(使用 api 中的用户列表内容),组的所有成员,然后使用 Linq 找出正确的结果集...对于开发/测试来说效果很好,但在拥有数百个用户的生产中这将是疯狂的...

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

编辑

下面是从客户端 Javascript 调用来搜索用户的代码;

  • AccessGroupId 是用于向用户授权的 Azure AD 组。仅有的该组的成员可以访问我自定义处理的网络应用程序OWin 中间件
  • 该方法旨在用于查找该组中的用户

代码工作正常,如下所示,只是没有应用过滤,这是输入参数 pre (来自 ui 中的文本框)的意图。我获取了访问组的所有成员。

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(批量)来检索用户显示名称,但这对我来说看起来是很大的开销。

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);

最佳答案

我会强调两种可能的方法:

  1. 使用自定义 JS 库执行对 Graph API 的请求。您仍然需要关心访问 token 并查看 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

    关于c# - 使用图形 api 在 Azure Active Directory 组中搜索用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26219371/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com