Azure Graph服务未找到新创建的用户

时间:2014-08-26 12:17:56

标签: azure-active-directory

我有一个使用Azure ACS和Azure AD来处理我们身份验证的Web应用程序。

我们在Web应用程序中有一个用户管理功能,允许用户创建新用户。这会获取用户名,密码,电子邮件等详细信息,并使用图形服务在azure中创建用户。

        var newUser = new Microsoft.WindowsAzure.ActiveDirectory.User
        {
            userPrincipalName = user.UserName,
            mailNickname = user.MailNickname,
            accountEnabled = true,
            displayName = user.FirstName + " " + user.Surname,
            givenName = user.FirstName,
            surname = user.Surname
        };

        newUser.passwordProfile = new PasswordProfile
        {
            forceChangePasswordNextLogin = false,
            password = user.Password
        };

        var graphService = GetGraphService(tenantName);
        graphService.AddTousers(newUser);
        graphService.SaveChanges();

然后,我们需要在Web应用程序数据库中为该用户创建一条记录。记录需要来自azure的对象ID。因此我们使用graphService来获取新创建的用户详细信息。这就是我的问题所在。它找不到用户。

    private string GetObjectIdFromAzure(string userName, string tenantName)
    {
        var graphService = GetGraphService(tenantName);
        var users = graphService.users;

        QueryOperationResponse<Microsoft.WindowsAzure.ActiveDirectory.User> response;
        response = users.Execute() as QueryOperationResponse<Microsoft.WindowsAzure.ActiveDirectory.User>;
        var user = response.FirstOrDefault(x => x.userPrincipalName == userName);

        return user != null ? user.objectId : "";
    }

我的代码几个月没有任何问题,只有今天我才遇到问题。更让我感到沮丧的是,我可以在没有任何问题的情况下进行相同代码的另一次部署。两个部署之间存在一些差异:

  1. 部署在Azure中使用不同的Access控制名称空间
  2. 部署在Azure AD中具有单独的应用程序
  3. 一个是https,一个是http
  4. 两个系统的用户都在同一目录下。

    我已在两个部署中登录以获取

    返回的用户数
    users.Execute()
    

    在两个系统中,它报告了100个(他们共享相同的用户)

    任何导致此操作停止工作的想法?我最近没有更改任何与此相关的代码,我还没有更改Azure上的任何配置,而且我没有更改应用程序的web.config

1 个答案:

答案 0 :(得分:0)

问题是由于我在检索用户后过滤了这些用户。图API只返回最多100个用户。

所以这个过程是这样的:

  1. 在Azure中创建的用户
  2. 返回成功消息
  3. Web App在Azure中搜索用户以获取对象ID
  4. 图表Api仅返回前100名用户。用户按字母顺序排在前100位,因此错误抛出
  5. 它正在进行第二次部署的原因是我使用demo_为用户名添加前缀(我们在发布之前使用此站点演示新功能)。这意味着它在前100名用户中被退回。

    我按如下方式更改了代码,因此它在检索期间而不是在以下之后进行过滤:

        private Microsoft.WindowsAzure.ActiveDirectory.User GetUserFromAzure(string userName, string tenantName, out DirectoryDataService graphService)
        {
            graphService = GetGraphService(tenantName);
            var users = (DataServiceQuery<Microsoft.WindowsAzure.ActiveDirectory.User>)graphService.users.Where(x => x.userPrincipalName == userName);
    
            QueryOperationResponse<Microsoft.WindowsAzure.ActiveDirectory.User> response;
            response = users.Execute() as QueryOperationResponse<Microsoft.WindowsAzure.ActiveDirectory.User>;
            var user = response.FirstOrDefault();
            return user;
        }