使用Azure AD进行Web API的集成测试

5
我正在开发一个由Azure Active Directory保护的WebAPI Web服务,该服务与基于用户登录的Office 365(SharePoint/Yammer)进行大量通信。
为了测试WebAPI端点,我编写了一个控制台应用程序,让我使用我的AAD凭据登录,然后调用端点。虽然能够工作,但我正在寻找一种替代这种测试方式的方法。最好是更可重复,并且不必每次都填写我的凭据。我正在寻找一个单元测试项目,但无法使Azure AD登录正常工作。
有什么建议可以使这个过程更容易吗?
2个回答

2
最简单的方法是将测试运行程序定义为 Azure AD 中的应用程序,并使用其自己的客户端 ID 和密钥调用 API。
要做到这一点,您需要执行以下几个步骤:
  1. 在 Azure AD 中的清单中添加 appRoles 到您的 API。这些是应用程序权限。
  2. 定义您的测试运行程序,并要求它具有您的 API 所需的必要应用程序权限。
  3. 在您的测试运行程序中,您现在应该能够使用测试运行程序的客户端 ID 和密钥获取访问令牌,无需进行用户身份验证。
在 API 方面也需要进行一些设置以进行应用程序权限控制,授权还必须查看角色声明。
您可以在此处找到关于定义应用程序权限并处理它们的示例:http://www.dushyantgill.com/blog/2014/12/10/roles-based-access-control-in-cloud-applications-using-azure-ad/
关于定义应用程序权限的更多信息:https://dev59.com/qIbca4cB1Zd3GeqPZr10#27852592
有关AAD中应用程序清单的更多信息:https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-application-manifest
编辑:如果您必须代表用户在API中进行调用,那么这当然行不通。
在这种情况下,我建议创建一个具有所需访问权限以运行测试的用户帐户。最好不要将其凭据硬编码,而是将其存储在其他地方。

1
我认为这不会起作用。我必须更加强调,但SharePoint似乎不接受应用程序身份验证方法。 - Dave Smits
1
如果你必须代表用户进行调用,那么唯一的选择就是为测试创建一个用户账户。 - juunas

0
如果你不想每次都“填写我的凭据”,一个解决办法是使用资源所有者密码凭证授权流程。这个流程可以灵活地获取令牌。在控制台应用程序中,你可以直接使用用户账号和密码来获取访问令牌,以访问你的受保护的网页 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"];
                }
            }
        }
    }

但问题在于,该流程将直接在代码中公开用户名和密码,这会带来潜在的攻击风险,因此我们始终避免直接处理用户凭据。因此,请确保您仅在安全环境中使用此流程进行测试。您可以参考this article以获取更多详细信息。

1
如果您选择这条路线,请务必阅读Vittorio的博客文章,了解此流程的局限性:http://www.cloudidentity.com/blog/2014/07/08/using-adal-net-to-authenticate-users-via-usernamepassword/ - dstrockis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接