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

问题描述 投票:1回答:2

我在我的测试AAD租户中创建了一个新用户帐户,比如[email protected]并为其设置密码。此新帐户是可以访问特定Web API的安全组的成员。我正在尝试编写一个测试(一个控制台程序),该测试使用用户凭据和app id作为受众以非交互方式获取访问令牌,然后调用端点。

我怎么做?

更新:

我正在尝试为我的Web API应用程序编写一组集成安全性测试。该应用程序使用它获取的AAD组作为一组声明并将它们视为角色。所以我想要一组具有不同角色的已知密码的测试用户帐户来测试不同安全上下文中端点的行为。这种方法适用于我多年的经典AD(我可以使用登录/密码对模拟用户并对启用了Windows Auth的服务执行SOAP调用)。

Updated2:

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

c# .net azure oauth-2.0 azure-active-directory
2个回答
2
投票

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

此流程通常不应用于身份验证,因为它在标准中主要作为传统升级路径存在。它不适用于联盟用户,使用MFA或密码过期的用户。但是,您自动测试的情况是我认为其使用可接受的情况之一。

以下是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"] = "[email protected]",
    ["password"] = "REDACTED"
});

using (var client = new HttpClient())
{
    var res = await client.SendAsync(req);

    string json = await res.Content.ReadAsStringAsync();
}

ADAL.NET不会因为执行此AFAIK而暴露过载,因此您需要像这样手动执行此操作。您需要使用应用程序的凭据替换参数+当然是用户的凭据。令牌URL还需要您的租户ID或域名。将resource参数更改为API的客户端ID / app ID URI。


0
投票

通过“非交互式”指的是登录窗口?如果给出了您所描述的流程和架构,那么这是不可能的。你怎么会得到用户凭据?

在构建解决方案时,您应该使用本文作为参考,以便了解各种OAuth 2.0流程和选项,包括本机应用程序的流程和选项。

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

© www.soinside.com 2019 - 2024. All rights reserved.