AquireTokenAsync与旧访问令牌ADAL

时间:2017-10-27 03:20:34

标签: azure xamarin single-sign-on access-token adal

我正在开发一个关于Xamarin的应用程序。我正在尝试跨多个应用实施单一登录。为此,我使用ADAL首次使用Azure AD对用户进行身份验证,用户在AcquireTokenAsync()中输入ADAL显示的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交叉检查令牌,它是一个有效的令牌。

修改 enter image description here

关于如何解决这个问题的任何想法?或者更好的方式我可以实现相同的?任何帮助都非常感谢。

1 个答案:

答案 0 :(得分:1)

如果你有refresh_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