AquireTokenAsync 与旧访问令牌 ADAL

Posted

技术标签:

【中文标题】AquireTokenAsync 与旧访问令牌 ADAL【英文标题】:AquireTokenAsync with old access token ADAL 【发布时间】:2018-04-08 14:00:21 【问题描述】:

我正在 Xamarin 上开发一个应用程序。我正在尝试跨多个应用程序实现单点登录。为此,我第一次使用 ADAL 使用 Azure AD 对用户进行身份验证,并且用户在 ADAL 在AcquireTokenAsync() 中显示的 O365 页面中输入凭据。

var  authContext = new AuthenticationContext(ServiceConstants.AUTHORITY);
var  authResult = await authContext.AcquireTokenAsync(resourceUri, ServiceConstants.CLIENTID, ServiceConstants.RETURNURI, param);
var apiAccessToken = authResult.AccessToken;

成功通过身份验证后,我将收到的令牌保存到一个文件中,即使用户卸载该应用程序,该文件仍然存在。

现在下次用户启动应用程序时,我将保存的令牌传递给 AcquireTokenAsync()UserAssertion

//Pass old accessToken
var userAssertion = new UserAssertion(accessToken);
var authResult = await authContext.AcquireTokenAsync(resourceUri, ServiceConstants.CLIENTID, userAssertion);

这按预期工作,并且用户通过身份验证而不显示 O365 登录屏幕。

现在,当用户卸载应用并重新安装它时,我想要同样的行为。就我而言,当用户卸载并重新安装应用程序时,我尝试通过将保存的令牌作为UserAssertion 添加到AquireTokenAsync() 以相同的方式获取新令牌。但是我收到这样的错误:-

Invalid JWT token. Token format not valid.

我通过 Postman 交叉检查了令牌,它是一个有效的令牌。

编辑

知道如何解决这个问题吗?还是我可以实现相同的更好方法?非常感谢任何帮助。

【问题讨论】:

您是说在两种情况下都读取了完全相同的文件,但如果卸载/重新安装应用程序则会失败?这不应该影响令牌,并且在两种情况下都应该以相同的方式工作。问题宁愿是 ADAL 库是否存储自己的东西,您也需要查看它。 如果令牌已经过期,我也看到过类似的错误。 很抱歉评论垃圾邮件...但是您获取令牌的方式在 Xamarin 上似乎是不明智的:github.com/AzureAD/azure-activedirectory-library-for-dotnet/… 【参考方案1】:

如果你有refresh_token,我们可以使用这个token直接通过RETS静默获取access_token。

这里有一个例子供你参考:

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

更多详情请参考以下链接。

Refreshing the access tokens

【讨论】:

感谢您的回答。但是我没有得到刷新令牌,因为它们不再随响应返回。我在我的问题中发布了一张图片。请看一下 看来您正在使用 3.X 版本的 adal 库进行开发。此版本的库将使用令牌缓存自动处理刷新令牌。对于您的方案,您可以尝试使用 2.X 版本,例如 2.29.0 我会尝试降级我的 adal 版本。或者,我可以尝试保存 AuthenticationContext 并使用它吗?在我的情况下,如果我只是不卸载应用程序并且仍然在每次应用程序启动时进行更新,通过将访问令牌作为用户断言传递,它工作正常。只有在重新安装应用程序时,我才会收到无效的 JWT 令牌错误。 我似乎无法降级我的 ADAL 版本,因为我在我的 Xamarin 应用程序和我的 PCL 中使用它 既然您提到代码在您不卸载应用程序时有效。我建议您跟踪请求并比较两个请求发送的差异。

以上是关于AquireTokenAsync 与旧访问令牌 ADAL的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 通过 Passport 实现 API 请求认证:沙箱测试篇(私人访问令牌)

如何在websocket javascript客户端中传递授权承载访问令牌

无法使用 OAuth 1.0a 授权我,请求访问令牌时失败

在微服务架构的每个服务中验证访问令牌 (JWT)

屏蔽/隐藏 github 访问令牌

验证微服务架构的每个服务中的访问令牌(JWT)