我有一个使用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 : "";
}
我的代码几个月没有任何问题,只有今天我才遇到问题。更让我感到沮丧的是,我可以在没有任何问题的情况下进行相同代码的另一次部署。两个部署之间存在一些差异:
两个系统的用户都在同一目录下。
我已在两个部署中登录以获取
返回的用户数users.Execute()
在两个系统中,它报告了100个(他们共享相同的用户)
任何导致此操作停止工作的想法?我最近没有更改任何与此相关的代码,我还没有更改Azure上的任何配置,而且我没有更改应用程序的web.config
答案 0 :(得分:0)
问题是由于我在检索用户后过滤了这些用户。图API只返回最多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;
}