2

我正在研究受Azure Active Directory保护的webapi webservice。网络服务基于登录的用户大量使用Office 365(SharePoint/Yammer)。使用Azure AD进行web api集成测试

测试web api终端节点我正在编写一个控制台应用程序,让我用我的AAD凭据登录,然后调用端点。它的工作原理,但寻找的东西来取代这种测试web api的方式。如果它更具可重复性,并且我不必每次都填写我的凭证,那将会很棒。我正在寻找一个单元测试项目,但无法让Azure AD登录工作。

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

回答

0

如果您不想“每次都填写我的凭证”,则一种解决方法是使用Resource Owner Password Credentials Grant flow。此流程可以轻松获得令牌。在控制台应用程序中,您可以直接使用用户帐户和密码获取受保护的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 
      &[email protected] 
      &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

+0

如果你走这条路线,请务必阅读Vittorio的博客文章,了解此流程的局限性:http://www.cloudidentity.com/blog/2014/07/08/using-adal-net-to-authenticate-用户-通usernamepassword / – dstrockis

0

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

要做到这一点有你需要做的几件事情:

  1. 添加appRoles到您的API在其Azure的AD清单。这些是应用程序权限。
  2. 定义您的测试运行器,并让它为您的API提供必要的应用程序权限。
  3. 在您的测试运行器中,您现在应该能够获得带有客户端ID和测试运行器的秘密的访问令牌,无需用户验证。

对于API端的应用程序权限也需要一些设置,授权也必须查看角色声明。

你可以在这里找到一个定义应用权限的例子,并在这里处理它们:http://www.dushyantgill.com/blog/2014/12/10/roles-based-access-control-in-cloud-applications-using-azure-ad/

有关定义应用权限的更多信息:https://stackoverflow.com/a/27852592/1658906

有关AAD中应用程序清单的更多信息:https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-application-manifest

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

在这种情况下,我会建议创建一个用户帐户,以便运行测试。最好不要对其凭据进行硬编码,而是将它们存储在别处。

+1

我不认为它会工作。我必须更多地强调它,但SharePoint似乎并不接受应用程序身份验证方法; –

+1

对,如果您必须代表用户拨打电话,那么唯一的选择是创建用于测试的用户帐户。 – juunas

相关问题