Microsoft graph api 尝试调用Microsoft Graph client时InvalidAuthenticationToken

Microsoft graph api 尝试调用Microsoft Graph client时InvalidAuthenticationToken,microsoft-graph-api,Microsoft Graph Api,下面是Microsoft Graph提供的一个示例。在本文中,它描述了如何使用需要访问令牌的DelegateAuthenticationProvider。 Marc LaFleur指定了一种获取访问令牌的方法,我将其与服务身份验证结合使用 尽管我收到的似乎是有效的访问令牌,但当我通过graph客户端发出命令时,我从Microsoft graph收到一个ServiceException,声明: "{ 代码:InvalidAuthenticationToken 消息:访问令牌验证失败。 内部误差 }

下面是Microsoft Graph提供的一个示例。在本文中,它描述了如何使用需要访问令牌的DelegateAuthenticationProvider。 Marc LaFleur指定了一种获取访问令牌的方法,我将其与服务身份验证结合使用

尽管我收到的似乎是有效的访问令牌,但当我通过graph客户端发出命令时,我从Microsoft graph收到一个ServiceException,声明:

"{ 代码:InvalidAuthenticationToken 消息:访问令牌验证失败。 内部误差 }"

我没有看到任何其他内部错误

我做错了什么

这是我提出的代码:

var clientId = "[app-guid]";
var clientSecret = "[secret-from-app-dashboard]";
var resource = "[app-guid]";
var baseUrl = "https://login.microsoftonline.com";
var loginUrl = "/[tenant guid]/oauth2/token";
using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(baseUrl);
    var content = new FormUrlEncodedContent(new[]
    {
        new KeyValuePair<string, string>("grant_type", "client_credentials"),
        new KeyValuePair<string, string>("client_id", clientId),
        new KeyValuePair<string, string>("client_secret", clientSecret),
        new KeyValuePair<string, string>("resource", resource)
    });
    var result = client.PostAsync(loginUrl, content).Result;
    string resultContent = result.Content.ReadAsStringAsync().Result;
    var json = JObject.Parse(resultContent);

    accessToken = (string)json["access_token"];

} 
var header = new AuthenticationHeaderValue("Bearer", accessToken);
var graphserviceClient = new GraphServiceClient(
new DelegateAuthenticationProvider(
(requestMessage) =>
{
    requestMessage.Headers.Authorization = header;


    return Task.FromResult(0);
}));
try
{
    var users = await graphserviceClient.Users.Request().GetAsync();
    var user = users.First();
}
catch (Microsoft.Graph.ServiceException servex)
{
    Console.WriteLine(servex);
}
var clientId=“[app guid]”;
var clientSecret=“[secret from app dashboard]”;
var resource=“[app guid]”;
var baseUrl=”https://login.microsoftonline.com";
var loginUrl=“/[tenant guid]/oauth2/token”;
使用(var client=new HttpClient())
{
client.BaseAddress=新Uri(baseUrl);
var content=newformurlencodedcontent(new[]
{
新的KeyValuePair(“授权类型”、“客户端凭据”),
新的KeyValuePair(“客户端id”,客户端id),
新的KeyValuePair(“客户端密码”,clientSecret),
新的KeyValuePair(“资源”,资源)
});
var result=client.PostAsync(loginUrl,content.result);
字符串resultContent=result.Content.ReadAsStringAsync().result;
var json=JObject.Parse(resultContent);
accessToken=(字符串)json[“访问令牌”];
} 
var header=新的AuthenticationHeaderValue(“承载者”,accessToken);
var graphserviceClient=新的graphserviceClient(
新的DelegateAuthenticationProvider(
(请求消息)=>
{
requestMessage.Headers.Authorization=头;
返回Task.FromResult(0);
}));
尝试
{
var users=await-graphserviceClient.users.Request().GetAsync();
var user=users.First();
}
catch(Microsoft.Graph.ServiceException servex)
{
控制台写入线(servex);
}

您将资源设置为指向您的网站,但它应该指向您希望访问的外部web资源。试试这个:

var resource = "https://graph.microsoft.com/";

您将资源设置为指向您的网站,但它应指向您希望访问的外部web资源。试试这个:

var resource = "https://graph.microsoft.com/";

谢谢,但现在我在我的例外情况中得到了这样的信息,“调用应用程序的身份无法建立”。对于返回的accessToken,它似乎没有问题,因为它包含正在验证的应用程序的名称。我可以在Postman中重新处理该问题,但在以正确URL注册的应用程序中没有。我会仔细检查你的注册信息,特别是你注册的网址。您是否在apps.dev.microsoft.com门户网站或Azure AD中注册?我还要确保您的权限设置正确。至少应该设置Microsoft Graph和Windows Azure服务管理。感谢您的帮助,但现在我在我的例外情况中得到了这一点,“无法建立调用应用程序的标识”。对于返回的accessToken,它似乎可以,因为它包含正在验证的应用程序的名称。我能够在Postman中重新编写该问题,但在以正确的URL注册的应用程序中没有。我会仔细检查你的注册信息,特别是你注册的网址。您是否在apps.dev.microsoft.com门户网站或Azure AD中注册?我还要确保您的权限设置正确。至少应设置Microsoft Graph和Windows Azure服务管理。