受众URI验证失败。观众不一致

时间:2017-03-24 13:28:19

标签: c# jwt outlook-web-addins

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

但是我们无法验证JWT令牌。它抛出以下invalidAudienceURi异常。但是当我们解码令牌时,用于生成令牌的URI将使用et query string动态生成。此查询字符串由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()

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

enter image description here

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

有谁能告诉我如何从这里开始?

谢谢, Vinay TC

1 个答案:

答案 0 :(得分:0)

如果我正确理解了问题(也许我不是),听起来你说@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_Puzzle_game); q1_tv = (TextView) findViewById(R.id.q1_tv); q2_tv = (TextView) findViewById(R.id.q2_tv); q3_tv = (TextView) findViewById(R.id.q3_tv); q4_tv = (TextView) findViewById(R.id.q4_tv); q5_tv = (TextView) findViewById(R.id.q5_tv); q6_tv = (TextView) findViewById(R.id.q6_tv); q7_tv = (TextView) findViewById(R.id.q7_tv); q8_tv = (TextView) findViewById(R.id.q8_tv); q9_tv = (TextView) findViewById(R.id.q9_tv); q10_tv = (TextView) findViewById(R.id.q10_tv); bt1 = (Button) findViewById(R.id.bt1); bt2 = (Button) findViewById(R.id.bt2); bt3 = (Button) findViewById(R.id.bt3); bt4 = (Button) findViewById(R.id.bt4); bt5 = (Button) findViewById(R.id.bt5); bt6 = (Button) findViewById(R.id.bt6); bt7 = (Button) findViewById(R.id.bt7); bt8 = (Button) findViewById(R.id.bt8); bt9 = (Button) findViewById(R.id.bt9); bt10 = (Button) findViewById(R.id.bt10); SP = getSharedPreferences("saved_data", MODE_PRIVATE); solved = SP.getInt("solved", 0); // LoadLevel & ResumeGame is just a method to get data from another class that have array Strings to fill the textviews and buttons if (solved > 0) { ResumeGame(null); } else { LoadLevel(null); } } 属性正在改变每个请求?

目前,以下是我对验证所用payload.aud的了解:

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

原始格式的<SourceLocation>字符串是由token分隔的三个base64编码对象。

  1. 标题 - JSON对象字符串
  2. Payload - JSON对象字符串
  3. 签名 - 在交换服务器上使用X509证书对报头和有效负载部分进行哈希处理。
  4. 如果您不知道.应该是什么,请检查原始hostUri字符串,解码Payload部分(您可能需要通过附加{{1}将其填充到mod 4长度} chars)。

    检查有效负载JSON对象,您将看到名为token的属性。 =的值是您应该用于aud的Uri。

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

    aud

    希望这有效......

    Inside the Identity Token