调用MS Graph

问题描述

在这种情况下,我很难找到一个可行的例子:

IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
.Create(clientId)
.WithRedirectUri(redirectUri)
.WithClientSecret(clientSecret)
.Build();

OnBehalfOfProvider authProvider =新的OnBehalfOfProvider(confidentialClientApplication,范围);

我面临的问题: 1.我从什么包中获得OnBehalfOfProfider? 2.假设我必须获取AAD用户的访问令牌,而无需用户的实际登录(这是一个守护程序)-如何构建UserAssertion实例?

此处的信息基于两个来源: MSDN“对提供商的支持https://docs.microsoft.com/en-us/graph/sdks/choose-authentication-providers?tabs=CS#OnBehalfOfProvider 和github的“如何调用OBO” https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/on-behalf-of

谢谢 艺术

解决方法

当您有一个API会接收包含用户信息的访问令牌,并且您想以该用户身份调用另一个API时,将使用代表流程。 听起来不像您这里的情况。

这听起来更像是一种无人值守的后台访问方案。 本质上有两种选择:

  1. 使用刷新令牌流
  2. 使用客户端凭据流
  3. 使用ROPC流

第一种方法较为复杂,但建议用于非关键过程。 MSAL确实做了很多简化。 工作方式:

  1. 用户使用以下方式对您的应用进行身份验证:授权码流
  2. MSAL将刷新令牌存储在良好的令牌缓存中(数据库/ Azure Key Vault等),您需要进行配置
  3. 您的后台处理器使用相同的令牌缓存,从而使其可以使用刷新令牌来获取新令牌

这种方法的缺点是它有点复杂,并且刷新令牌可能会过期,需要用户重新进行身份验证。

第二种方法更简单,但是需要使用应用程序权限而不是委托权限。 使用客户端凭据,您的应用程序需要自己访问所有数据,而无需任何用户。 因此,这需要大量访问,并依赖支持此方法的API。 但这是简单可靠的。

第三种方法是我不推荐的方法。 它要求您使用用户的用户名和密码来获取该用户的令牌。 不仅需要存储用户的密码,而且如果用户启用了多因素身份验证,是来宾用户等,则根本不起作用。