代码之家  ›  专栏  ›  技术社区  ›  devangi

AcquireTokenAsync在Web API中使用UserAssertion失败

  •  0
  • devangi  · 技术社区  · 7 年前

    开发了一个使用ADAL的Web API。Net v3.14进行身份验证。下面是获取access\u令牌的代码(使用ADAL提供的默认令牌缓存)

    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();
    

    它成功返回Access_令牌。现在,在该令牌过期1小时后,我已经实现了以下代码,以使用Refresh\u令牌更新它(假设Refresh\u令牌将作为实现的ADAL令牌缓存从缓存中获取):

      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
    

    此代码给出错误:

    “无效的JWT令牌。AADSTS50027:无效的JWT令牌。令牌格式无效”。

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   Nan Yu    7 年前

    您在哪里获得访问令牌?在web api端还是客户端?

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

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