AcquireTokenAsync 因 Web 中的 UserAssertion 失败 API

AcquireTokenAsync failed with UserAssertion in Web API

已开发 Web API,它使用 ADAL .Net v3.14 进行身份验证。现在这里是获取 access_token 的代码(使用 ADAL 提供的默认 TokenCache)

var provider = "https://login.microsoftonline.com/XXXXXXXX.onmicrosoft.com"
var service = "https://XXXXXXXX.onmicrosoft.com/XXXXXXService" //which is registered as service in Azure AD
var clientId  = "01d2b529-XXXX-XXXX-b794-XXXXXXXXXXXX" //client app registered on Azure AD
AuthenticationContext authContext = new AuthenticationContext(provider);
UserPasswordCredential uc = new UserPasswordCredential(user, password);
AuthenticationResult result = authContext.AcquireTokenAsync(service, clientId, uc).ConfigureAwait(false).GetAwaiter().GetResult();

成功returnsAccess_Token。现在,此令牌过期 1 小时后,我已实现以下代码以使用 Refresh_Token 更新它(假设 refresh_token 将作为已实现的 ADAL TokenCache 从缓存中获取):

  AuthenticationContext authContext = new AuthenticationContext(provider);
  UserAssertion userAssertion = new UserAssertion(oldtoken, "urn:ietf:params:oauth:grant-type:jwt-bearer", upn);
  AuthenticationResult result = authContext.AcquireTokenAsync(resource,clientId, userAssertion).ConfigureAwait(false).GetAwaiter().GetResult();
  var token = result.AccessToken

此代码给出错误:

"Invalid JWT token. AADSTS50027: Invalid JWT token. Token format not valid".

我检查了 'oldtoken' 变量,它是有效的 JWT 令牌。

您从哪里获得访问令牌?在网络 api 端或客户端 ?

如果您使用资源所有者密码授予流程在 Web api 端获取访问令牌。并希望使用刷新令牌更新访问令牌。您只需要再次使用获取令牌功能,因为您是直接使用用户凭据获取令牌。

如果您在客户端获取访问令牌,并使用该访问令牌访问您的网站 api,则客户端应用程序应负责检查有效访问令牌并使用刷新令牌更新访问令牌。