0

我很难找到适合这种情况的工作示例:

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

OnBehalfOfProvider authProvider = new OnBehalfOfProvider(confidentialClientApplication, scopes);

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

这里的信息基于两个来源:MSDN 'on behlaf of provider' https://docs.microsoft.com/en-us/graph/sdks/choose-authentication-providers?tabs=CS#OnBehalfOfProvider 和 github's 'how to调用 OBO' https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/on-behalf-of

谢谢艺术

4

1 回答 1

0

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

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

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

第一种方法更复杂,但推荐用于非关键流程。MSAL 确实简化了很多。它的工作方式:

  1. 用户使用例如授权码流向您的应用程序进行身份验证
  2. MSAL 将刷新令牌存储在良好的令牌缓存(数据库/Azure Key Vault 等)中,您需要对此进行配置
  3. 您的后台处理器使用相同的令牌缓存,允许它使用刷新令牌来获取新令牌

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

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

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

于 2020-10-12T06:43:35.190 回答