c# - Azure Active Directory 获取所有用户 - (可能死锁)

标签 c# asp.net-mvc-4 azure asp.net-web-api azure-active-directory

我在 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 App 上并执行调用 GetUsersAAD() 方法的服务后,它不起作用,http 请求卡住,几分钟后我收到 500 错误超时。

这是一个基于 AspNet MVC 的 WebApi2 项目。

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

最佳答案

好吧,经过大量阅读和搜索后,我能够使其工作,似乎 .Result 它很容易出现死锁,并且不建议在异步方法上使用,我也没有充分利用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;
}

我必须将方法调整为异步任务及其调用。

关于c# - Azure Active Directory 获取所有用户 - (可能死锁),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39730577/

相关文章:

asp.net-mvc - 在 MVC Unobtrusive Validation 中如何验证 DateTime?

sql-server - 在 Azure 自动化 powershell 脚本中从 SQL 打印消息不起作用

sql-server - 如何使用 PowerShell 将域用户分配给 MS SQL Server 实例

asp.net - 生成重置密码 token 在 Azure 网站中不起作用

c# - Entity Framework 和 SCOPE_IDENTITY

c# - 根据索引位置对数组元素求和,最好使用 Linq

c# - 如何返回包含文件的文件夹列表?

c# - EF Core - 用于处理特定类型的全局设置

c# - 如何将数据库数据缓存到内存中以供 MVC 应用程序使用?

javascript - 如何将 javascript 对象传递给 C# MVC 4 Controller