Identity Server 4, API не авторизован для вызова конечной точки самоанализа
Я надеюсь, что кто-то может указать мне правильное направление.
Я пытаюсь позволить клиенту javascript общаться с API с помощью эталонных токенов. Я использую Identity Server 4.
Что идет хорошо:
При входе в систему клиент / веб-приложение javascript направляется на сервер удостоверений для проверки пользователя и пароля. В случае успеха пользователь перенаправляется обратно в приложение javascript /webapplication и имеет действительный IdentityToken.
Что не идет нормально:
Когда клиент / веб-приложение javascript делает вызов к моему API, запрос получает API. Затем API хочет проверить полученный токен идентификации с Identity Server, чтобы получить токен доступа, но не может связаться с сервером, выполнив следующую ошибку в консоли:
fail: IdentityServer4.Validation.ApiSecretValidator[0] API validation failed. fail: IdentityServer4.Endpoints.IntrospectionEndpoint[0] API unauthorized to call introspection endpoint. aborting.
Совершенно ясно, что Api не разрешено общаться с сервером...
Я думаю, что где-то есть ошибка конфигурации, но я просто не могу видеть, где. Перепробовал всевозможные настройки, у меня нет идей, чтобы попробовать или изменить...
Это то, что я имею до сих пор:
Для клиента JavaScript:
Я использую пакет oidc-redux, конфиг, который я использую:
var userManagerConfig = {
authority: "http://localhost:50289",
redirect_uri: "http://localhost:3000/callback",
client_id : "js",
response_type : "id_token",
scope :"openid",
};
Конфигурации Identity Server 4
Определение клиента:
public static IEnumerable<Client> GetClients()
{
return new List<Client>
{
new Client
{
ClientId = "js",
ClientName = "my js client",
AllowedGrantTypes = GrantTypes.Implicit,
RequireClientSecret = false,
RequireConsent = false,
RedirectUris = { "http://localhost:3000/callback" },
PostLogoutRedirectUris = { "http://localhost:3000" },
AllowAccessTokensViaBrowser = false,
AllowedCorsOrigins = { "http://localhost:3000" },
AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
"myApi"
}
}
};
}
Определение ресурсов API:
public static IEnumerable<ApiResource> GetApiResources()
{
return new List<ApiResource>
{
new ApiResource("myApi")
{
ApiSecrets =
{
new Secret("superweaksecret")
}
}
};
}
в настройке сервиса добавляю все это вместе в контейнер:
// configure identity server with in-memory stores, keys, clients and scopes
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryPersistedGrants()
.AddProfileService<CustomClaimService>()
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
.AddAspNetIdentity<ApplicationUser>();
Настройка Api
Основываясь на.net Core, в методе ConfigureService у меня есть следующее:
services.AddAuthentication("Bearer")
.AddIdentityServerAuthentication(options =>
{
options.Authority = "http://localhost:50289";
options.RequireHttpsMetadata = false;
options.ApiSecret = "superweaksecret";
options.ApiName = "myApi";
options.EnableCaching = false;
});
Надеюсь, кто-то увидит мою ошибку.
Если я пропустил информацию или код, необходимый для правильного оповещения, пожалуйста, дайте мне знать.
С уважением, Роэл
1 ответ
IdentityServer ожидает, что общие секреты будут хэшироваться.
new ApiResource("myApi") {
ApiSecrets = {
new Secret("superweaksecret".Sha512())
}
}