【问题标题】:Audience URI validation failed. Audience does not match受众 URI 验证失败。观众不匹配
【发布时间】:2017-08-18 12:55:57
【问题描述】:

我们想要验证使用 office.js Office.context.mailbox.getUserIdentityTokenAsync((result) 获取的 JWT 令牌。我们已经实现了自己的 JwtSecurityTokenHandler 以获取用户的唯一 ID 并将其作为声明添加到请求。所以我们可以在我们所有的功能中授权用户。

但我们无法验证 JWT 令牌。它抛出以下 invalidAudienceURi 异常。但是,当我们解码令牌时,用于生成令牌的 URI 会使用 et 查询字符串动态生成。这个 et 查询字符串是由 office.js 动态注入的。

例外:

Microsoft.Exchange.WebServices.Auth.Validation.InvalidTokenAudienceException was unhandled by user code
  HResult=-2146233088
  Message=Audience URI validation failed. Audience does not match.
  Source=Microsoft.Exchange.WebServices.Auth
  StackTrace:
       at Microsoft.Exchange.WebServices.Auth.Validation.AppIdentityToken.ProcessToken(Uri extensionServiceHost, String key) in \\REDMOND\EXCHANGE\BUILD\E15\15.00.0913.000\SOURCES\sources\dev\EwsManagedApi\src\Auth\Validation\ClientExtensionIdentityToken.cs:line 220
       at Microsoft.Exchange.WebServices.Auth.Validation.AppIdentityToken.Validate(Uri extensionServiceHost, String catchedKey) in \\REDMOND\EXCHANGE\BUILD\E15\15.00.0913.000\SOURCES\sources\dev\EwsManagedApi\src\Auth\Validation\ClientExtensionIdentityToken.cs:line 185
       at Microsoft.Exchange.WebServices.Auth.Validation.AppIdentityToken.Validate(Uri extensionServiceHost) in \\REDMOND\EXCHANGE\BUILD\E15\15.00.0913.000\SOURCES\sources\dev\EwsManagedApi\src\Auth\Validation\ClientExtensionIdentityToken.cs:line 155
       at UatWork.Web.CustomTokenHandler.ValidateToken(String token, TokenValidationParameters validationParameters, SecurityToken& validatedToken) in C:\Users\vinay\Source\Workspaces\UatWork-O365\Development\UatWork\src\UatWork.Web\Startup.cs:line 176
       at Microsoft.AspNet.Authentication.JwtBearer.JwtBearerHandler.<HandleAuthenticateAsync>d__1.MoveNext()

图像:异常和自定义处理程序

已尝试的解决方案 1:我们尝试覆盖 ValidateAudience 方法。但是在运行时,这个方法 id 永远不会被执行。 解决方案 2 已尝试:我们尝试添加 AudienceValidator 作为 jwttoken 处理程序的选项。不幸的是,这也没有被调用。

谁能告诉我从这里怎么走?

谢谢, 维奈TC

【问题讨论】:

    标签: c# jwt outlook-web-addins


    【解决方案1】:

    如果我正确理解了问题(也许我没有正确理解),听起来您是在说 payload.aud 属性正在更改每个请求?

    目前,这是我对验证使用的hostUri 的了解:

    如果提供的 hostUri 与清单 XML 中定义的 &lt;SourceLocation&gt; 元素的第一个实例不匹配,则 token.Validate() 调用将失败。

    原始形式的token 字符串是由.s 分隔的三个base64 编码对象。

    1. 标头 - JSON 对象字符串
    2. 有效负载 - JSON 对象字符串
    3. 签名 - 在交换服务器上使用 X509 证书对标头和负载部分进行哈希处理。

    如果您不知道您的 hostUri 应该是什么,请检查原始的 token 字符串,解码 Payload 部分(您可能需要通过附加 = 字符将其填充到 mod 4 长度)。

    检查负载 JSON 对象,您将看到一个名为 aud 的属性。 aud 的值是您应该为 hostUri 使用的 Uri。


    因此,如果您可以捕获原始令牌,则可以使用以下 JavaScript 来获取所需的 hostUri:

    var rawTokenString = "..."; //insert actual raw token string!
    var rawPayload = rawTokenString.split('.')[1];
    while(rawPayload.length % 4 !=0) {
        rawPayload+='=';
    }
    var payload = JSON.parse(atob(rawPayload));
    console.info(payload.aud);
    

    希望这行得通...

    Inside the Identity Token

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 2019-08-27
      • 2020-04-22
      • 2019-03-21
      • 2018-06-19
      • 2021-10-16
      • 1970-01-01
      相关资源
      最近更新 更多