Azure活动目录获取所有用户-(可能死锁)

本文关键字:死锁 用户 活动 获取 Azure | 更新日期: 2023-09-27 18:09:09

我在Azure Active directory中有150个用户,我通过这种方式获得它们:

    public List<Generic.UserAAD> GetUsersAAD()
    {
        ActiveDirectoryClient activeDirectoryClient = AuthenticationHelper.GetActiveDirectoryClientAsApplication();
        IPagedCollection<IUser> usersA = activeDirectoryClient.Users.ExecuteAsync().Result;
        List<IUser> queryUsers = new List<IUser>();
        List<Generic.UserAAD> listUsers = new List<Generic.UserAAD>();
        do
        {
            List<IUser> queryUsersList = usersA.CurrentPage.ToList();
            queryUsers.AddRange(queryUsersList);
            usersA = usersA.MorePagesAvailable ? usersA = usersA.GetNextPageAsync().Result : null;
        } while (usersA != null);
        if (queryUsers.Count > 0)
        {
            listUsers = queryUsers.Select(u => new Generic.UserAAD { DName = u.DisplayName, UName= u.UserPrincipalName }).ToList();
        }
        return listUsers;
    }

这是AuthenticationHelper类

public class AuthenticationHelper
{
    public static async Task<string> AcquireTokenAsyncForApplication()
    {
        return await GetTokenForApplication().ConfigureAwait(false);
    }

    public static ActiveDirectoryClient GetActiveDirectoryClientAsApplication()
    {
        Uri servicePointUri = new Uri(Constantes.graphUrl);
        Uri serviceRoot = new Uri(servicePointUri, Constantes.tenantId);
        ActiveDirectoryClient activeDirectoryClient = new ActiveDirectoryClient(serviceRoot,
            async () => await AcquireTokenAsyncForApplication().ConfigureAwait(false));
        return activeDirectoryClient;
    }

    public static async Task<string> GetTokenForApplication()
    {
        AuthenticationContext authContext = new AuthenticationContext(Constantes.authority, false);
        ClientCredential clientCred = new ClientCredential(Constantes.clientId, Constantes.appKey);
        AuthenticationResult authenticationResult = authContext.AcquireTokenAsync(Constantes.graphUrl,
                      clientCred).Result;
        var token = authenticationResult.AccessToken;
        return token;
    }
}

所以问题是,它在本地工作完美,但在Azure Web应用程序上部署它并执行调用GetUsersAAD()方法的服务后,不工作,http请求冻结,几分钟后我得到一个500错误超时。

这是一个基于asp.net MVC的WebApi2项目

所以我真的很感激你能给我的任何帮助,谢谢。

Azure活动目录获取所有用户-(可能死锁)

好的,在阅读和搜索了很多之后,我能够使它工作,似乎。结果它很容易发生死锁,不建议使用异步方法,也不建议使用async/await/task调用,所以我让它工作的方式是:

public async Task<List<Generic.UserAAD>> GetUsersAAD()
{
    ActiveDirectoryClient activeDirectoryClient = AuthenticationHelper.GetActiveDirectoryClientAsApplication();
    Task<IPagedCollection<IUser>> usersTask = activeDirectoryClient.Users.ExecuteAsync();
    IPagedCollection<IUser> usersA = await usersTask;
    List<IUser> queryUsers = new List<IUser>();
    List<Generic.UserAAD> listUsers = new List<Generic.UserAAD>();
    do
    {
        List<IUser> queryUsersList = usersA.CurrentPage.ToList();
        queryUsers.AddRange(queryUsersList);
        usersA = usersA.MorePagesAvailable ? await usersA.GetNextPageAsync() : null;
    } while (usersA != null);
    if (queryUsers.Count > 0)
    {
        listUsers = queryUsers.Select(u => new Generic.UserAAD { DName = u.DisplayName, UName= u.UserPrincipalName }).ToList();
    }
    return listUsers;
}

我必须将方法调整为async Task和对它的调用