我正在开发一个关于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交叉检查令牌,它是一个有效的令牌。
关于如何解决这个问题的任何想法?或者更好的方式我可以实现相同的?任何帮助都非常感谢。
答案 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
更多详情请参阅以下链接。