IdentityServer3 - 使用引用令牌时的ScopeSecretValidator

时间:2016-08-25 13:34:06

标签: identityserver3

在收到访问令牌(引用访问令牌)后,我的api中间件调用instropection端点来获取jwt令牌。不幸的是我收到了json响应,并显示错误消息unauthortize。

2016-08-24 13:33:39.505 -04:00 [Debug]启动范围验证 2016-08-24 13:33:39.505 -04:00 [Debug]开始解析Basic Authentication的秘密 2016-08-24 13:33:39.505 -04:00 [调试] Parser发现秘密:“BasicAuthenticationSecretParser” 2016-08-24 13:33:39.505 -04:00 [信息]发现密码:“webapp123.hybric.flow” 2016-08-24 13:33:39.507 -04:00 [信息]找不到该名称的范围。中止 2016-08-24 13:33:39.507 -04:00 [警告]范围未经授权调用内省端点。则中止。

看起来我们正在使用传递给instropection端点的客户端应用程序ID来搜索客户端应用程序请求的范围。 问题:

他是对的吗? Id3可以记住客户端要求的范围吗? 我可以使用api ClientId调用instrospection endpint吗? - 我不想使用请求引用令牌的客户端应用程序的客户端ID。

代码如下:

var scope =(等待_scopes.FindScopesAsync(new [] {parsedSecret.Id}))。FirstOrDefault();

1 个答案:

答案 0 :(得分:0)

ntrospection端点用于验证令牌而不是获取Jwt。要调用Introspection终点,您需要在身份验证请求中传递“Scope”和“Scope secret”,而不是客户端ID。 如果您将参考令牌发送到具有有效范围名称和秘密的instrospection端点,您将在响应中获得声明。

 public async Task ValidateValidReferenceTokenUsingIntrospectionEndPoint()
            {
                var tokenResponse = await GetTokenResponseForClientCredentialsFlow(IdsModel.AccessTokenType.Reference);

                var introspectionClient = new IntrospectionClient(
                   IntrospectionEndpoint,
                   "Api1",  // scope name, scope secret
                   "Api1Secret");

                var response = await introspectionClient.SendAsync(new IntrospectionRequest
                {
                    Token = tokenResponse.AccessToken
                });

                var jsonResult = JsonConvert.DeserializeObject<Dictionary<string, object>>(response.Raw);

                response.IsActive.Should().Be(true);
                response.IsError.Should().Be(false);


                jsonResult.Should().Contain("iss", ValidIssuer);
                jsonResult.Should().Contain("aud", ValidAudience);
                jsonResult.Should().Contain("client_id", "referenceTokenClient");
jsonResult.Should().Contain("client_claim1", "claim1value");
                jsonResult.Should().Contain("active", true);
            }