我正在尝试使用Identity Server 4保护我的API。现在,我已经浏览了http://docs.identityserver.io/en/release/quickstarts/1_client_credentials.html上的所有文档,并建立了一些成功的演示。但是,有一件事我无法理解。
例如,首先,我们需要在IS4上定义如下所示的客户端:
new Client
{
ClientId = "client",
// no interactive user, use the clientid/secret for authentication
AllowedGrantTypes = GrantTypes.ClientCredentials,
// secret for authentication
ClientSecrets =
{
new Secret("secret".Sha256())
},
// scopes that client has access to
AllowedScopes = { "api1" }
}
然后在API上,我们通过添加IdentityServer4.AccessTokenValidation
包并将配置添加到startup.cs来对其进行保护
services.AddMvcCore()
.AddAuthorization()
.AddJsonFormatters();
services.AddAuthentication("Bearer")
.AddIdentityServerAuthentication(options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.ApiName = "api1";
});
最后我们添加app.UseAuthentication();
现在,这一切在运行时都有效,但是,我不了解的部分是API中定义的秘密在哪里。如您所见,客户端显然希望有一个秘密,但我没有在API的任何地方定义此秘密。我也没有在IS4的任何地方定义有关我的API的任何内容,以表示您正在保护API免受此URI的侵害。
那么从IS4知道API并验证其请求的角度来看,这实际上是如何工作的?
编辑:
为澄清一些混乱,是的,我在上面的代码中选择了一个客户端,现在我不应该这样做,并且在其中提供了一个秘密,但是我仍然不了解IS4如何知道保护我的特定API。如果请求来自www.somerandomapi.com,该怎么办?从我正在阅读的内容来看,它无论如何都可以工作。根据您的写法,确实可以知道客户端正在传递密码,但是在我的代码中没有地方告诉IS4应该保护哪个API。