我有一个web应用程序,使用Azure ACS和Azure AD来处理我们的身份验证。
我们在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 : "";
}
我的代码工作没有任何问题几个月,只有今天我有问题。更让我沮丧的是,我有另一个部署相同的代码,它的工作没有任何问题。这两个部署之间的一些差异如下:
- 部署在Azure中使用不同的访问控制命名空间
- 部署在Azure AD中有单独的应用程序
- 一个是https一个是http
两个系统的用户在同一个目录下。
我已经在两个部署中加入了登录,以获得
返回的用户数量users.Execute()
在两个系统中,它报告100(它们共享相同的用户)
你知道什么会导致这个停止工作吗?我最近没有更改任何与此相关的代码,我没有更改Azure上的任何配置,也没有更改web。应用程序配置
这个问题是由于我在检索用户后过滤用户而引起的。图形API最多只能返回100个用户。
过程是这样的:
- 在Azure中创建的用户
- 返回成功消息
- Web应用程序在Azure中搜索用户以获取对象ID
- Graph Api只返回前100名用户。用户未按字母顺序进入前100名,因此抛出错误
它在我们的第二次部署中工作的原因是我在用户名前加上了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;
}