【发布时间】:2020-02-25 12:22:05
【问题描述】:
我正在尝试将 IdentityServer4 的“LocalApi”功能与一些自定义策略一起使用。
我有一个 API(托管在与 IdentityServer4 相同的应用程序实例上),它分为三个部分(服务器、管理器、产品)和三个客户端(服务器、管理器、产品)。客户端只能调用 API 的专用部分,我会使用基于范围的策略来执行此操作。
所以我有以下内容:
启动:
services.AddLocalApiAuthentication(); // Add API hosted on same application than IdentityServer
services.AddAuthorization(options =>
{
options.AddPolicy("Manager", policy =>
{
//policy.RequireClaim("scope", configuration.GetValue<string>("EchinoLoginApiManagerScopeOptions:Name"));
policy.RequireClaim("scope", "local_api_manager_scope");
policy.RequireClaim("scope", IdentityServerConstants.LocalApi.ScopeName);
});
options.AddPolicy("Server", policy =>
{
//policy.RequireClaim("scope", configuration.GetValue<string>("EchinoLoginApiServerScopeOptions:Name"));
policy.RequireClaim("scope", "local_api_server_scope");
policy.RequireClaim("scope", IdentityServerConstants.LocalApi.ScopeName);
});
options.AddPolicy("Product", policy =>
{
//policy.RequireClaim("scope", configuration.GetValue<string>("EchinoLoginApiProductScopeOptions:Name"));
policy.RequireClaim("scope", "local_api_product_scope");
policy.RequireClaim("scope", IdentityServerConstants.LocalApi.ScopeName);
});
});
还有我的 ApiResource
new ApiResource
{
Name = IdentityServerConstants.LocalApi.ScopeName,
Scopes =
{
new Scope()
{
Name = IdentityServerConstants.LocalApi.ScopeName,
DisplayName = IdentityServerConstants.LocalApi.ScopeName,
},
new Scope()
{
Name = "local_api_product_scope",
DisplayName = echinoLoginApiProductScopeOptions.DisplayName,
UserClaims = echinoLoginApiProductScopeOptions.UserClaims
},
new Scope()
{
Name = "local_api_manager_scope",
DisplayName = echinoLoginApiManagerScopeOptions.DisplayName,
UserClaims = echinoLoginApiManagerScopeOptions.UserClaims
},
new Scope()
{
Name = "local_api_server_scope",
DisplayName = echinoLoginApiServerScopeOptions.DisplayName,
UserClaims = echinoLoginApiServerScopeOptions.UserClaims
}
}
}
最后是我的服务器客户端
new Client
{
ClientId = echinoServerOptions.Id,
ClientName = echinoServerOptions.Name,
ClientSecrets =
{
new Secret(echinoServerOptions.Secret.Sha256())
},
AllowedGrantTypes = GrantTypes.ClientCredentials,
//AllowedScopes = AddLocalApiScope(echinoServerOptions.AllowedScopes)
AllowedScopes = { "IdentityServerApi", "server_scope", "local_api_server_scope" }
},
所以在我的控制器中我使用 [Authorize(Policy = "Server")] 但我总是有一个身份验证失败。 如果我使用 [Authorize(LocalApi.PolicyName)] 它可以工作,但我没有自定义策略。
JWT 令牌的负载如下:
{
"nbf": 1582632694,
"exp": 1582636294,
"iss": "https://localhost:44334",
"aud": [
"IdentityServerApi",
"EchinoLoginApi"
],
"client_id": "EchinoServer",
"scope": [
"IdentityServerApi",
"local_api_server_scope",
"server_scope"
]
}
我一定错过了什么,但我找不到什么。
谁能帮帮我?
【问题讨论】:
标签: c# asp.net-core identityserver4