图SDK SDK OAUTH ADAL客户端凭据是否可以重用?后来

时间:2017-04-03 18:18:22

标签: wpf oauth-2.0 microsoft-graph adal onedrive

因此,我们有一个应用程序,允许您创建一个xml文件,在稍后阶段再次运行应用程序(可能会或可能没有用户出席)。文件存储在所选的用户云驱动器平台上。所以这个过程是

工作流程 1

使用用户1详细信息/输入进行云身份验证 选择要下载和使用的文件 保存并加密文件元数据并将令牌刷新到xml文件。 (app workflow 1)

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

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

问题

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

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

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

感谢

2 个答案:

答案 0 :(得分:1)

我假设您在提及图表sdks 时正在开发Microsoft Graph SDK

AFAIK,此库不包含任何默认的身份验证实现。相反,用户需要使用他们选择的库或直接针对OAuth端点进行身份验证,并使用内置的DelegateAuthenticationProvider类对每个请求进行身份验证。

如果您使用Active Directory Authentication Library对Azure AD进行身份验证,则可以使用使用内存来存储缓存的default token cache,也可以根据需要实现令牌缓存。

  

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

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

  

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

如果您想自己执行请求以刷新访问令牌,可以参考下面的请求,更多细节可以参考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

答案 1 :(得分:0)

好的,所以答案是从PublicIdentityApp获取tokencache并进行序列化,如下所示。

   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()