Настройка веб-проекта (ASP. NET Core 3) в качестве клиента и ApiResource для IdentityServer. - PullRequest
0 голосов
/ 05 февраля 2020

Я знаю, что это абсурдно и крайне глупо, но как должен выглядеть ваш Startup.cs (для проекта client + Api Resource), если вы хотите быть и Client по отношению к IdentityServer, и ApiResource, используя маркеры ссылок?

У меня была следующая идея: Требовать от пользователей аутентификации с использованием OpenID Connect. Храните учетные данные в файлах cookie, но после этого вместо того, чтобы полагаться на них, продолжайте делать то же, что и обычный ApiResource, с эталонным токеном -> попадать в конечную точку самоанализа, проверить, является ли токен (полученный от повара ie) действительным, если так -> разрешить доступ, если нет -> вернуться к аутентификации.

К сожалению, я не могу заставить вышеописанное поведение работать вообще. Я не уверен, какая схема куда, особенно куки-файл. Если я установлю его в качестве схемы по умолчанию, авторизация пройдет, но если токен будет отклонен, у меня все равно будет доступ к ресурсам, потому что API по-прежнему смотрит на cook ie как ссылку на токен, хотя на самом деле токен уже отозван. (Introspect вернет false)

Мне не нужны указатели конфигурации для проекта, в котором размещен Identity Server.

1 Ответ

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

Я думаю, что способ сделать это - использовать тип неявного предоставления, например:

    new Client
                    {
                        ClientId = "Client_implicit",
                        ClientSecrets = new [] { new Secret("secret".Sha256()) },
                        AllowedGrantTypes = GrantTypes.Implicit,
                        AllowedScopes = new [] {
                            IdentityServerConstants.StandardScopes.OpenId,
                            IdentityServerConstants.StandardScopes.Profile,
                        },
                        AllowAccessTokensViaBrowser = true,
                        RedirectUris = new [] { "...Api Adress .../signin-oidc" },
                        PostLogoutRedirectUris = { "...Api Adress ../signout-callback-oidc" },
                    }

В классе запуска Api:

  services.AddAuthentication(options =>
            {
                options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
            })
   .AddCookie()
   .AddOpenIdConnect(options =>
   {
       options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
       options.Authority = "...IdentityServer Adress";
       options.RequireHttpsMetadata = false;
       options.ClientId = "Client_Implicit";
       options.ClientSecret = "secret";
       options.ResponseType = "id_token token";
       options.Scope.Add("profile");
       options.Scope.Add("openid");
       options.GetClaimsFromUserInfoEndpoint = true;
       options.SaveTokens = true;
   });

И в вашем случае вы не вам не нужен ресурс Api, так как ваш клиент - это ресурс Api, также

для выхода из системы. Создайте действие на вашем API для выхода из системы:

 await HttpContext.SignoutAsync("Cookie");
 await HttpContext.SignoutAsync("OpenIdConnect");

, поэтому Senario для входа будет как это:

  • пользователь попытается войти в систему
  • API перенаправит использование на IdentityServer
  • IdentityServer проверит учетные данные пользователя и в случае успеха будет перенаправлять на API с (access_token)

  • , пользователь теперь вошел в систему

Senario для выхода из системы:

  • пользователь вызовет выход из системы;
  • access_token удалит из cook ie и из IdentitySever
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...