我使用了我的Azure Active Directory,并使用ADAL库获取令牌并使用该令牌调用api。我用来获取令牌的代码如下所示:
var url = "https://login.microsoftonline.com/something.onmicrosoft.com/oauth2/logout?post_logout_redirect_uri=www.google.com";
AuthenticationContext ac = new AuthenticationContext(APIsConstant.authorityForDomain2);
AuthenticationResult ar = await ac.AcquireTokenAsync(APIsConstant.graphResourceUriForDomain2, APIsConstant.clientIdForDomain2, new Uri("www.google.com"),string.Empty,string.Empty);
string accessToken = ar.AccessToken;
ac.TokenCache.Clear();
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, url);
var response = await client.SendAsync(request);
答案 0 :(得分:1)
您未在请求中包含访问令牌。您可以通过在发送请求之前向请求添加Authorization标头来实现此目的。
// ... code to get authentication result ...
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, url);
// Add an Authorization header using your authentication result (ar)
request.Headers.TryAddWithoutValidation("Authorization", ar.CreateAuthorizationHeader());
var response = await client.SendAsync(request);
请注意,您不需要将身份验证结果的访问令牌存储在变量中。您可以直接使用包含令牌的CreateAuthorizationHeader
方法。
您可能还需要更改拨打ac.TokenCache.Clear();
的位置。正如您现在所拥有的那样,它可能会删除刚刚创建的令牌,即使使用授权标头,请求仍然会失败。您可以在获得身份验证结果之前将呼叫向上移动,或在发出API请求之后向下移动呼叫。或者考虑完全取消通话。