Web api 与 Azure AD 的集成测试

Dav*_*its 5 integration-testing asp.net-web-api azure-active-directory

我正在开发受 Azure Active Directory 保护的 webapi web 服务。基于登录的用户,Web 服务与 Office 365 (SharePoint / Yammer) 密切相关。

为了测试 web api 端点,我正在编写一个控制台应用程序,让我使用我的 AAD 凭据登录,然后调用端点。它有效,但正在寻找替代这种测试 web api 的方式的东西。如果它更具可重复性并且我不必每次都填写我的凭据,那就太好了。我正在寻找一个单元测试项目,但无法让 Azure AD 登录工作。

任何提示如何使这更容易?

Nan*_* Yu 0

如果您不想“每次都填写我的凭据”,一种解决方法是使用资源所有者密码凭据授予流程。这个流程很灵活,可以轻松获得代币。在控制台应用程序中,您可以直接使用用户帐户和密码来获取受保护的 Web API 的访问令牌。下面的代码供您参考:

 static  void Main(string[] args)
    {

        test().Wait();
    }


    public static async Task test()
    {

        using (HttpClient client = new HttpClient())
        {
            var tokenEndpoint = @"https://login.windows.net/a703965c-e057-4bf6-bf74-1d7d82964996/oauth2/token";
            var accept = "application/json";

            client.DefaultRequestHeaders.Add("Accept", accept);
            string postBody = @"resource=https%3A%2F%2Fgraph.microsoft.com%2F  //here could be your own web api 
            &client_id=<client id>
            &grant_type=password
            &username=nanyu@xxxxxxx.onmicrosoft.com
            &password=<password>
            &scope=openid";

            using (var response = await client.PostAsync(tokenEndpoint, new StringContent(postBody, Encoding.UTF8, "application/x-www-form-urlencoded")))
            {

                if (response.IsSuccessStatusCode)
                {
                    var jsonresult = JObject.Parse(await response.Content.ReadAsStringAsync());
                    var token = (string)jsonresult["access_token"];
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

但问题是 Flow 会直接在代码中暴露用户名和密码,这也带来了潜在的攻击风险,我们总是会避免直接处理用户凭证。因此,请确保您仅使用此流程在安全环境中进行测试。您可以参考这篇文章了解更多详细信息。