【发布时间】: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/…
标签: azure xamarin single-sign-on access-token adal