代码之家  ›  专栏  ›  技术社区  ›  UserControl

使用用户凭据获取Web API的令牌

  •  1
  • UserControl  · 技术社区  · 7 年前

    testuser1@mytenant.onmicrosoft.com 设置密码。此新帐户是可以访问特定Web API的安全组的成员。我正在尝试编写一个测试(一个控制台程序) 非交互式

    我该怎么做?

    我正在尝试为我的webapi应用程序编写一组集成安全测试。应用程序使用它获得的AAD组作为一组声明,并将它们视为角色。因此,我需要一组具有不同角色的已知密码的测试用户帐户来测试端点在不同安全上下文下的行为。多年来,我一直在使用经典广告(在那里我可以使用 登录/密码 配对并对启用了Windows身份验证的服务执行SOAP调用)。

    已更新2:

    我可以使用一组应用程序注册,而不是测试用户帐户,并获得一个令牌没有任何问题使用 但将企业应用程序分配给安全组需要高级AAD层,这非常昂贵:(

    2 回复  |  直到 7 年前
        1
  •  2
  •   juunas    7 年前

    这就是资源所有者密码凭证(ROPC)授权流的基本用途。 您将应用程序的凭据与用户的凭据一起提供给Azure AD,并获得访问令牌。

    此流通常不应用于身份验证,因为它主要作为遗留升级路径存在于标准中。 然而,您的自动化测试案例是我认为其使用是可以接受的场景之一。

    下面是C#中的调用示例:

    string tokenUrl = $"https://login.microsoftonline.com/joonasapps.onmicrosoft.com/oauth2/token";
    var req = new HttpRequestMessage(HttpMethod.Post, tokenUrl);
    
    req.Content = new FormUrlEncodedContent(new Dictionary<string, string>
    {
        ["grant_type"] = "password",
        ["client_id"] = "23d3be1b-a671-4452-a928-78fb842cb969",
        ["client_secret"] = "REDACTED",
        ["resource"] = "https://graph.windows.net",
        ["username"] = "testuser@joonasapps.onmicrosoft.com",
        ["password"] = "REDACTED"
    });
    
    using (var client = new HttpClient())
    {
        var res = await client.SendAsync(req);
    
        string json = await res.Content.ReadAsStringAsync();
    }
    

    ADAL.NET不会暴露一个重载,所以你需要像这样手动操作。 当然,您需要用应用程序的凭据+用户的凭据替换参数。 令牌URL还需要您的租户id或域名。

        2
  •  0
  •   Mehdi Ibrahim    7 年前

    在构建解决方案时,您应该将本文用作参考,以便了解各种OAuth2.0流和选项,包括用于本机应用程序的流和选项。

    https://docs.microsoft.com/en-us/azure/active-directory/develop/authentication-scenarios#native-application-to-web-api

    推荐文章