我刚刚为这里描述的.Net 4.5库实现了这个JSON Web Token Handler:
我有一个ACS服务,应该将JWT令牌返回给我的应用程序。但是,当我应该将令牌返回到我的应用程序时(当浏览器重定向到我的依赖方的返回uri时),我反而得到了这个例外:
WIF10200:不支持带有单个参数的GetIssuerName。呼叫: 'GetIssuerName(SecurityToken securityToken,string issuer)'。
我认为这不是我的代码直接问题;因为如果我进行解决方案范围的搜索,“GetIssuerName”不在我的解决方案中。我认为它可能与WIF想要信任的证书颁发者有关,但是我已经按照我上面链接的关于从ACS站点的FederationMetadata导入证书的文章中的说明......我完全被这个问题困住了一。
奇怪的是,当我将我的依赖方令牌类型从JWT更改为SAML 1或2时,我的依赖方的Return Uri从未被击中,我只是被重定向回我的领域。我希望最终落在我的回归Uri上。如果有人能向我解释这两种现象,那将会有很大的帮助!
更新
.NET 4.5中的GetIssuerName方法是System.IdentityModel.Tokens.ValidatingIssuerNameRegistry类的一部分(还有一个System.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry类,使用相同的方法,但那不是我正在使用的那个) 。
通过查看元数据,类中有2个重写方法:
public override string GetIssuerName(SecurityToken securityToken);
public override string GetIssuerName(SecurityToken securityToken, string requestedIssuerName);
我从WIF获得的错误似乎直接来自那里列出的第一个方法,正如您可以从下面的堆栈跟踪中看到的那样。随着我的依赖方返回JWT,某个地方应该调用第二个方法,其签名有第二个参数,但是调用第一个。我希望我知道如何改变它。
[NotSupportedException:WIF10200:带有单个参数的GetIssuerName 不受支持。调用:'GetIssuerName(SecurityToken securityToken, 字符串发行者)'。]
System.IdentityModel.Tokens.ValidatingIssuerNameRegistry.GetIssuerName(SecurityToken securityToken)+156
Microsoft.IdentityModel.Tokens.JWT.JWTSecurityTokenHandler.ValidateIssuer(JWTSecurityToken jwt,TokenValidationParameters validationParameters)+1303
Microsoft.IdentityModel.Tokens.JWT.JWTSecurityTokenHandler.ValidateToken(JWTSecurityToken jwt,TokenValidationParameters validationParameters)+278
Microsoft.IdentityModel.Tokens.JWT.JWTSecurityTokenHandler.ValidateToken(SecurityToken 令牌)+2248
System.IdentityModel.Tokens.SecurityTokenHandlerCollection.ValidateToken(SecurityToken 令牌)+135
System.IdentityModel.Services.TokenReceiver.AuthenticateToken(SecurityToken token,Boolean ensureBearerToken,String endpointUri)+502
System.IdentityModel.Services.WSFederationAuthenticationModule.SignInWithResponseMessage(HttpRequestBase 请求)+1508
System.IdentityModel.Services.WSFederationAuthenticationModule.OnAuthenticateRequest(对象 发件人,EventArgs args)+700
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +80 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)+165