C# 通过Microsoft.Graph邀请用户时出错 预期行为

C# 通过Microsoft.Graph邀请用户时出错 预期行为,c#,azure,microsoft-graph-api,asp.net-core-2.2,C#,Azure,Microsoft Graph Api,Asp.net Core 2.2,应邀请用户,然后向用户更新更多信息 实际行为 来源 "Microsoft.Graph.Core" 信息 "Code: Unauthorized\r\nMessage: Insufficient privileges to perform requested operation by the application '00000003-0000-0000-c000-000000000000'. ControllerName=MSGraphInviteAPI, ActionName=Create

应邀请用户,然后向用户更新更多信息

实际行为 来源

"Microsoft.Graph.Core"
信息

"Code: Unauthorized\r\nMessage: Insufficient privileges to perform requested operation by the application '00000003-0000-0000-c000-000000000000'. ControllerName=MSGraphInviteAPI, ActionName=CreateInvite, URL absolute path=/api/9cXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/invites\r\n\r\nInner error\r\n"
堆栈跟踪

   at Microsoft.Graph.HttpProvider.SendAsync(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken cancellationToken)
   at Microsoft.Graph.BaseRequest.SendRequestAsync(Object serializableObject, CancellationToken cancellationToken, HttpCompletionOption completionOption)
   at Microsoft.Graph.BaseRequest.SendAsync[T](Object serializableObject, CancellationToken cancellationToken, HttpCompletionOption completionOption)
   at Web.Api.Infrastructure.Infrastructure.Repositories.AzureRepository.CreateUser(CreateUserCommand user) in C:\Users\SamPrecious\source\repos\Adept\src\adept-web-api\Web.Api.Infrastructure\Infrastructure\Repositories\AzureRepository.cs:line 166
复制行为的步骤 SDK版本: netcoreapp2.2
“Microsoft.Graph”Version=“1.13.0” “Microsoft.Graph.Core”Version=“1.13.0”

IDE版本: VS代码-1.31.1 Vsiual演播室企业2017-4.7.03056

我有这个方法(将创建GraphServiceClient的代码移动到方法中以证明一点) 客户端使用应用程序注册进行身份验证(我获得了一个访问令牌),但当要邀请的代码运行时,authenticationContext.AcquireTokenAsync再次触发,我在上面的堆栈跟踪中得到一个错误。根据API文档,客户端应用程序具有User.Invite.All、User.ReadWrite.All、Directory.ReadWrite.All

为什么代码中的AppId会更改为上述消息中的AppId

公共异步任务CreateUser(CreateUserCommand用户)
{
尝试
{
var clientCredential=新的clientCredential(_配置[“appId”],_配置[“secret”]);
var authenticationContext=新的authenticationContext(_配置[“authority”]);
var authenticationResult=authenticationContext.AcquireTokenAsync(“https://graph.microsoft.com“,clientCredential)。结果;
var delegateAuthProvider=新的DelegateAuthenticationProvider((requestMessage)=>
{
requestMessage.Headers.Authorization=新的AuthenticationHeaderValue(“承载者”,authenticationResult.AccessToken);
返回Task.FromResult(0);
});
var con=新的GraphServiceClient(delegateAuthProvider);
//邀请用户
邀请=新邀请();
invitation.InvitedUserDisplayName=user.Name;
invitation.SendInvitationMessage=true;
invitation.InvitedUserEmailAddress=user.Email;
invitation.InviteRedirectUrl=”http://localhost";
var result=await con.Invitations.Request().AddAsync(invitation);
//更新用户
var aadUser=\u connection.GetConnection().ActiveDirectoryUsers.GetById(result.Id);
var updateUser=result.InvitedUser;
updateUser.DisplayName=user.Name;
updateUser.Nastname=用户。姓氏;
updateUser.Mail=user.Email;
updateUser.MobilePhone=user.Phone;
等待con.Users[result.InvitedUser.Id].Request().UpdateAsync(updateUser);
返回aadUser.UserPrincipalName;
}
捕获(系统异常)
{
投掷;
}
}
CreateUserCommand:

public类CreateUserCommand
{
公共字符串名称{get;set;}
公共字符串姓氏{get;set;}
公共字符串电子邮件{get;set;}
公用字符串电话{get;set;}
}
下面是应用程序注册的捕获

权限:

IConfiguration对象中的应用程序Id

只有在用户上下文中调用API时,委托权限才起作用

由于您使用的是客户端凭据,因此没有用户。 仅应用应用程序权限,因此在此处设置正确的权限

此外,由于您有一个异步函数,因此最好也等待令牌:

var authenticationResult = await authenticationContext.AcquireTokenAsync("https://graph.microsoft.com", clientCredential);

好极了——这就像一个符咒。我必须正确地研究委托权限和应用程序权限之间的差异。应用程序权限=应用程序本身调用API时应用的权限。委派权限=当应用程序代表用户调用API时应用。应用程序权限也适用于SPN吗?基本上,它们是授予服务主体的角色。