我想运行我的 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 测试非常有用。