Graph SDK OAUTH ADAL 客户端凭据以供重用?之后

Graph SDK OAUTH ADAL client credentials for reuse? later

所以我们有一个应用程序,允许您创建一个 xml 文件,该文件在稍后阶段再次运行该应用程序(可能有也可能没有用户参与)。文件存储在用户选择的云驱动平台上。所以过程是

工作流程 1

使用用户 1 向云进行身份验证 details/input Select 个要下载和使用的文件 将文件元数据和刷新令牌保存并加密到 xml 文件。 (应用工作流程 1)

工作流程2(可重复数千次) 使用用户 2 将 xml 文件发送到另一台电脑。(通过电子邮件或通过控制台远程 然后该电脑在用户 2

下运行

启动应用 应用程序使用保存在 xml 文件中的刷新令牌自动进行身份验证,无需用户输入(因为创建工作流 1 的用户很有可能与工作流 2 运行 不在同一个城市 下载文件 应用文件(应用程序工作流程 2) 问题 我们提供的所有其他平台(Dropbox 和 google 和 onedrive)使我们能够访问刷新令牌并允许我们再次使用它进行身份验证,但是 onedrive for business(graph sdks)为我们提供了一个令牌缓存,它是会话基于?

问题

所以我需要知道如何从令牌缓存中获取刷新令牌,以便我们可以在稍后阶段重用它。 (是的,我知道它会在 6 个月后过期,这是可以接受的)。

当我有刷新令牌时,如何启动刷新令牌的调用

进一步注意 - 我已经设法通过直接调用其余 api 调用在 silverlight(不支持 sdks)之前处理所有平台,但我们正在将我们的解决方案转换为 WPF 并希望使用SDK

谢谢

当你提到 graph sdks.

时,我假设你正在开发 Microsoft Graph SDK

据我所知,这个库不包含任何默认的身份验证实现。相反,用户将希望使用他们选择的库进行身份验证,或者直接针对 OAuth 端点进行身份验证,并使用内置的 DelegateAuthenticationProvider class 来对每个请求进行身份验证。

如果您使用 Active Directory Authentication Library, you can use the default token cache 对 Azure AD 进行身份验证,它使用内存来存储缓存,或者您可以根据您的要求实施令牌缓存。

So I need to know how I can get the refresh token from the Token Cache so we can reuse it at a later stage. (yes I'm aware that it will expire after 6 months which is acceptable) .

当您使用ADAL库时,无需手动获取刷新令牌,如果存在刷新令牌,它将为我们处理更新访问令牌。

When i have the refresh token how do initiate a call to refresh the token

如果您想自己执行刷新访问令牌的请求,可以参考下面的请求,更详细的可以参考this document

POST /{tenant}/oauth2/token HTTP/1.1
Host: https://login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&refresh_token=OAAABAAAAiL9Kn2Z27UubvWFPbm0gLWQJVzCTE9UkP3pSx1aXxUjq...
&grant_type=refresh_token
&resource=https%3A%2F%2Fservice.contoso.com%2F
&client_secret=JqQX2PNo9bpM0uEihUPzyrh    // NOTE: Only required for web apps

好的,所以答案是从 PublicIdentityApp 获取令牌缓存并按如下方式序列化。

   var tokenCache = _app.UserTokenCache;
   var tokenBytes = tokenCache.Serialize();
   var tokenString = Convert.ToBase64String(tokenBytes);

稍后反序列化。

_app = new Microsoft.Identity.Client.PublicClientApplication(ClientID);
var array = Convert.FromBase64String(bytestring);
_app.UserTokenCache.Deserialize(array);
authHelper = new AuthenticationHelper(_app);
var authorise = await authHelper.GetTokenForUserAsync()