我正在编写一个需要在Azure Active Directory中创建用户的MVC应用程序。我已经将创建用户的代码包装在自己的库中,并且它在单元测试中工作正常。但是,当在我的MVC控制器中调用相同的代码时,对AddUserAsync的调用永远不会返回。作为测试,我改变了我的控制器,以便不是创建一个新用户而只是尝试获取用户。控制器看起来像:
public class RegistrationController : BaseController
{
public ActionResult Index()
{
AadAccessHelper adHelper = new AadAccessHelper();
var client = adHelper.AdClient;
AADUser aadUser = adHelper.GetUserByPrincipalName("AUser@ThisDirectory.onmicrosoft.com");
return View();
}
}
获取用户的帮助程序类似于:
private async Task<User> GetUserByUserName(ActiveDirectoryClient adClient, string userName)
{
var user = await adClient.Users.Where(u => u.UserPrincipalName == userName).ExecuteSingleAsync();
return (User) user;
}
public AADUser GetUserByPrincipalName(string userName)
{
Task<User> user = GetUserByUserName(AdClient, userName);
user.Wait(new TimeSpan(0, 1, 0));
if (true == user.IsFaulted)
{
throw user.Exception;
}
if (null == user.Result)
{
return null;
}
return MapUserToAADUser(user.Result);
}
无论我给它多长时间,对ExecuteSingleAsync的调用永远不会返回。我错过了什么?
测试程序是运行Chrome中出现的网站(我也使用了两个IE,结果相同),我导航到注册页面(我为了测试目的而移动了代码)和那是悲伤开始的时候。
再次:代码在单元测试中运行时工作正常。我是否需要使用其他客户端而不是Microsoft.Azure.ActiveDirectory.GraphClient.ActiveDirectoryClient?
我完成后应用程序的目的是注册新用户并允许指定用户管理应用程序用户(重置密码,更改用户属性,将用户分配到组等)。
我在Visual Studio 2015中,无论最新的东西是从GitHub出来的。
非常感谢任何帮助。
答案 0 :(得分:1)
我们不应该直接返回AADUser,而应该使用Task&lt; AADUser取代。这段代码对我很有用:
public async Task<AADUser> GetUserByPrincipalName(string userName)
{
var user = await GetUserByUserName(activeDirectoryClient, userName);
return new AADUser()
{
displayName = user.DisplayName
};
}
控制器:
public async Task<ActionResult> test()
{
var user = await new AzureADGraphTest.Users().GetUserByPrincipalName("userName@tenant.onmicrosoft.com");
return View();
}