如何为我的 API 集成测试用例创建具有 "upn"/"unique_name"(用户的电子邮件 ID)的授权令牌作为声明的一部分



我想运行我的 API 测试用例,作为我生成授权令牌的一部分。以前,应用程序终结点要求将用户电子邮件 ID 作为查询字符串传递,但现在已将其修改为从授权令牌读取用户电子邮件 ID。我想修改我的 GenerateAuthToken 方法,以包含 EmailId 作为生成的身份验证令牌的一部分。

我参考了文档中的文档,

https://learn.microsoft.com/en-us/azure/architecture/multitenant-identity/claims

我尝试使用UserAssertion传递UserEmailId,如下所示。

string authorityUrl = string.Format("https://login.microsoftonline.com/{0}", authority);
        AuthenticationContext authContext = new AuthenticationContext(authorityUrl, false);
        ClientCredential clientCredential = new ClientCredential(this.utils.GetClientId(), this.utils.GetClientSecret());
        UserAssertion userAssertion = new UserAssertion("demoUser@tenant1.onmicrosoft.com");
        AuthenticationResult authResult = authContext.AcquireTokenAsync(this.resource, clientCredential, userAssertion).Result;

但我得到以下例外,AdalService异常: AADSTS50027: JWT 令牌无效或格式不正确。

预期:我希望用户电子邮件 ID 成为声明的一部分,目前不是。

{
  "aud": "1bbc71b1-56b3-404c-8961-76ed5f603fab",
  "iss": "https://login.microsoftonline.com/e46fc01a-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0",
  "iat": 1549957732,
  "nbf": 1549957732,
  "exp": 1549961632,
  "aio": "42JgYGiUKZN6pn6WdbPPN9bLIW8ZAA==",
  "azp": "1bbc71b1-56b3-404c-8961-76ed5f603fab",
  "azpacr": "1",
  "tid": "e46fc01a-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "uti": "rbpCCAb6TEuNRRaen_0DAA",
  "ver": "2.0"
}

这是我发现 ROPC 流可用的极少数情况之一。ADAL 没有为它提供重载(主要是为了人们不要滥用这个流我猜(,所以你必须手动进行调用。下面是一个示例:

string tokenUrl = _authority + "oauth2/token";
var req = new HttpRequestMessage(HttpMethod.Post, tokenUrl)
{
    Content = new FormUrlEncodedContent(new Dictionary<string, string>
    {
        ["grant_type"] = "password",
        ["client_id"] = "your-clientid",
        ["client_secret"] = "your-clientsecret",
        ["resource"] = "resource-uri-or-client-id-of-api",
        ["username"] = "your-username",
        ["password"] = "your-password"
    })
};
HttpResponseMessage res = await _client.SendAsync(req);
string json = await res.Content.ReadAsStringAsync();
AadTokenResponse tokenResponse = JsonConvert.DeserializeObject<AadTokenResponse>(json);

这里的响应类非常简单:

public class AadTokenResponse
{
    [JsonProperty("access_token")]
    public string AccessToken { get; set; }
}

请注意,仅当用户没有 MFA、不需要使用 ADFS 进行身份验证等时,这才有效。不应将此流用于生产租户,而应仅对测试租户中的测试用户使用。实质上是获取访问令牌以代表用户调用 API,而不显示登录屏幕。这不应用于跳过应用程序中的登录屏幕。但是,我发现它对于这种 API 测试非常有用。

最新更新