IdentityServer4 LocalApi с пользовательской политикой /. Net Core 3.1 - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь использовать функцию «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"]}

Я должен что-то упустить, но не могу найти, что

Кто-нибудь может мне помочь?

Спасибо

1 Ответ

0 голосов
/ 25 февраля 2020

для локальных API вы должны использовать [Authorize (LocalApi.PolicyName)] вместе с вашей собственной политикой.

[Authorize("productpolicy")]
[Authorize(LocalApi.PolicyName)]
[ApiController]
[Route("api/[controller]")]
public class ProductController : ControllerBase
{...

или вы можете обработать ее другим способом

                options.AddPolicy(ClientLocalScopes.AuthenticationAuthorization, policy =>
            {
                policy.AddAuthenticationSchemes(IdentityServerConstants.LocalApi.AuthenticationScheme);
                policy.RequireAuthenticatedUser();
// write your codes here
                });
...