Я думаю, что способ сделать это - использовать тип неявного предоставления, например:
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