我们要验证使用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()
图片:异常和自定义处理程序
解决方案1尝试:我们尝试覆盖ValidateAudience方法。但在运行时,此方法ID永远不会执行。 解决方案2尝试:我们尝试添加AudienceValidator作为jwttoken处理程序的选项。不幸的是,这也没有被称为。
有谁能告诉我如何从这里开始?
谢谢, Vinay TC
答案 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编码对象。
如果您不知道.
应该是什么,请检查原始hostUri
字符串,解码Payload部分(您可能需要通过附加{{1}将其填充到mod 4长度} chars)。
检查有效负载JSON对象,您将看到名为token
的属性。 =
的值是您应该用于aud
的Uri。
因此,如果您可以捕获原始令牌,则可以使用以下JavaScript来获取所需的hostUri:
aud
希望这有效......