Я пытаюсь использовать функцию «LocalApi» IdentityServer4 с некоторыми пользовательскими политиками.
У меня есть API (размещенный в том же экземпляре приложения, что и IdentityServer4), который разделен на три части (сервер, Менеджер, Продукт) и для трех клиентов (Сервер, Менеджер, Продукт). Клиент может вызывать только выделенную часть API, и я делал бы это с политиками, основанными на областях.
Итак, у меня есть следующее:
Starup:
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"]}
Я должен что-то упустить, но не могу найти, что
Кто-нибудь может мне помочь?
Спасибо