在IdentityServer中,客户端秘密和范围秘密之间有什么区别?

时间:2017-01-23 09:57:44

标签: identityserver4 identityserver3

有人可以解释两者之间的区别吗?我理解客户秘密,但范围秘密仍然不明确......以及为什么范围秘密甚至需要存在?

虽然我发现documentation在某些方面很有帮助,但我没有发现它有助于解释两者之间的区别。

2 个答案:

答案 0 :(得分:13)

感谢Scott Brady,我能够回答我的问题。这是我发现的......

客户端秘密

正如Scott Brady所说,当客户端应用程序调用{​​{3}}时,会使用客户端密钥。您的客户端应用程序必须具有有效的客户端ID和客户端密钥才能调用令牌端点。

范围内的秘密

但是,如果您的资源服务器需要调用IdentityServer,该怎么办?当资源服务器调用token end point时会发生这种情况。当您的应用程序使用引用令牌或使用JWT的服务器端验证时,会发生这种情况。因此,假设经过身份验证的客户端调用资源服务器上受保护的端点。然后,资源服务器必须使用IdentityServer验证该JWT承载令牌。但是,从资源服务器发送到IdentityServer的请求必须是受保护的调用。也就是说,资源服务器必须向IdentityServer提供JWT承载令牌才能使用内省端点。资源服务器无法使用它尝试验证的令牌,因为它属于客户端(受众不是资源服务器,而是客户端应用程序)。此外,资源服务器不确定承载令牌是否有效。资源服务器使用有问题的承载令牌来验证验证所述承载令牌的请求是没有意义的。所以现在有一个问题......资源服务器如何将经过身份验证的请求发送到IdentityServer?

这就是Scope Secrets的用武之地.IdentityServer解决这个问题的方法是允许你创建一个包含Scope Secret的Scope。此范围已添加到资源服务器身份验证选项中。例如:

app.UseIdentityServerBearerTokenAuthentication(
                new IdentityServerBearerTokenAuthenticationOptions
                {
                    Authority = "http://localhost:5000",
                    ClientId = "api", //The Scope name
                    ClientSecret = "api-secret", //This is the non hashed/encrypted Scope Secret
                    RequiredScopes = new[] { "api" } //Must add the Scope name here
                });

通过使此范围成为必需,我们可以确保任何经过身份验证的客户端应用程序都具有此范围。然后在IdentityServer中添加Scope,如下所示:

new Scope
    {
        Name = "api",
        DisplayName = "Scope DisplayName",
        Description = "This will grant you access to the API",

        //The secret here must be Sha256-ed in order for the /introspection end point to work.
        //If the API's IdentityServerBearerTokenAuthenticationOptions field is set as so ValidationMode = ValidationMode.ValidationEndpoint,
        //then the API will call the /introspection end point to validate the token on each request (instead of ValidationModel.ValidationLocal.
        //The ClientSecret must be the NON Sha256-ed string (for example Api = "api-secret" then scope secret must = "api-secret".Sha256())
        //for the token to be validated. There must be a Scope that has the same name as the ClientId field in IdentityServerBearerTokenAuthenticationOptions.
        //This is an API authenticates with IdentityServer
         ScopeSecrets = new List<Secret>
                         {
                              new Secret("api-secret".Sha256())
                         },
          Type = ScopeType.Resource
      }

因此,当资源服务器调用内省终点时,它只会使用Scope Secret作为Client Secret,并使用Scope名称作为Client Id。

答案 1 :(得分:7)

客户端机密用于授权访问token endpoint。此端点使用客户端ID和客户端密钥,并允许您请求访问令牌。

范围秘密用于授权访问introspection endpoint。此端点使用范围标识和范围保密,因为只允许访问标记中包含的范围内省它。