Asp.net web api web api与Azure AD的集成测试

Asp.net web api web api与Azure AD的集成测试,asp.net-web-api,integration-testing,azure-active-directory,Asp.net Web Api,Integration Testing,Azure Active Directory,我正在开发一个受Azure Active Directory保护的webapi Web服务。基于登录的用户,Web服务与Office 365(SharePoint/Yammer)密切相关 为了测试web api端点,我正在编写一个控制台应用程序,让我使用AAD凭据登录,然后调用端点。它可以工作,但是正在寻找一些东西来取代这种测试web api的方法。如果它更具可重复性,而且我不必每次都填写凭证,那就太好了。我正在寻找一个单元测试项目,但无法让Azure广告登录工作 有什么建议可以让这更简单吗 最

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

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


有什么建议可以让这更简单吗

最简单的方法是将测试运行程序定义为Azure AD中的应用程序,并让它使用自己的客户端id和密码调用API

要做到这一点,您需要做以下几件事:

  • approvles
    添加到Azure AD中的API清单中。这些是应用程序权限
  • 定义您的测试运行程序,并使其要求API具有必要的应用程序权限
  • 在您的测试运行程序中,您现在应该能够获得一个带有客户端id和测试运行程序机密的访问令牌,而无需用户身份验证
  • API端的应用程序权限也需要一些设置,授权还必须查看角色声明

    您可以在此处找到定义应用程序权限并处理它们的示例:

    有关定义应用程序权限的详细信息:

    有关AAD中应用程序清单的详细信息:

    编辑:如果您必须在API中代表用户进行调用,那么这当然不起作用

    在这种情况下,我建议创建一个具有运行测试所需访问权限的用户帐户。最好不要硬编码其凭据,而是将其存储在其他位置。

    如果您不想“每次填写我的凭据”,一种解决方法是使用。此流程非常灵活,可以轻松获得令牌。在Console应用程序中,您可以直接使用用户帐户和密码获取受保护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"];
                    }
                }
            }
        }
    
    static void Main(字符串[]args)
    {
    test().Wait();
    }
    公共静态异步任务测试()
    {
    使用(HttpClient=new HttpClient())
    {
    var tokenpoint=@”https://login.windows.net/a703965c-e057-4bf6-bf74-1d7d82964996/oauth2/token";
    var accept=“application/json”;
    client.DefaultRequestHeaders.Add(“接受”,接受);
    string postBody=@“resource=https%3A%2F%2Fgraph.microsoft.com%2F//这里可能是您自己的web api
    &客户识别码=
    &授权类型=密码
    &用户名=nanyu@xxxxxxx.onmicrosoft.com
    &密码=
    &范围=openid”;
    使用(var response=wait client.PostAsync(令牌端点,新的StringContent(postBody,Encoding.UTF8,“application/x-www-form-urlencoded”))
    {
    if(响应。IsSuccessStatusCode)
    {
    var jsonresult=JObject.Parse(wait response.Content.ReadAsStringAsync());
    var token=(字符串)jsonresult[“访问令牌”];
    }
    }
    }
    }
    

    但问题是,flow将直接在代码中暴露用户名和密码,这也带来了潜在的攻击风险,我们将始终避免直接处理用户凭据。因此,请确保在安全环境中使用此流进行测试。你可以参考更多的细节。

    我不这么认为;他要工作了。我不得不更加强调这一点,但SharePoint似乎不接受应用程序身份验证方法;是的,如果您必须代表用户拨打电话,那么唯一的选择就是创建一个用户帐户进行测试。如果您选择此路线,请务必阅读Vittorio关于此流程限制的博客文章: