Используйте IdentityServer3.AccessTokenValidation в веб-API ASP.Net для общения с IDS4 - PullRequest
0 голосов
/ 25 ноября 2018

Мы настроили Identity Server 4 с .Net Core 2.1.У нас есть ASP.Net Web API на .Net 4.6.Это не может быть перенесено в Core.Я установил IdentityServer3.AccessTokenValidation в этом проекте API вместе с OWN и другими необходимыми пакетами.Я могу использовать клиента и получить токен доступа от IdentityServer.Когда клиент использует этот токен с API, я получаю 401. Я искал в Интернете решения, но не могу найти ничего, что я мог бы использовать для этой работы.Я попробовал это - https://github.com/IdentityServer/IdentityServer3.AccessTokenValidation/issues/164, но не сработало.Я не могу найти образцы.Поэтому у меня вопрос: нельзя ли использовать IdentityServer3.AccessTokenValidation для общения с IDS4?

Нужно ли вместо этого настраивать IDS3?

UPDATE

Я включил подробное ведение журнала и получил следующее

Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 POST http://localhost:44333/connect/introspect application/x-www-form-urlencoded 70
IdentityServer4.Hosting.IdentityServerMiddleware:Information: Invoking IdentityServer endpoint: IdentityServer4.Endpoints.IntrospectionEndpoint for /connect/introspect
IdentityServer4.Validation.ApiSecretValidator:Error: API validation failed.
IdentityServer4.Endpoints.IntrospectionEndpoint:Error: API unauthorized to call introspection endpoint. aborting.
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 26.5186ms 401 
Microsoft.AspNetCore.Server.Kestrel:Information: Connection id "0HLIJ2C0UKBLN", Request id "0HLIJ2C0UKBLN:00000008": the application completed without reading the entire request body.

Ниже приведен мой код API в методе конфигурации

        var config = new HttpConfiguration();
        config.MapHttpAttributeRoutes();

        app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
        {
            Authority = "https://localhost:44333",
            RequiredScopes = new[] { "api" },

            ClientId = "api",
            ClientSecret = "secret",

            //DelayLoadMetadata = true
        });

        app.UseWebApi(config);

Код на стороне IDS4 для ApiResource.

    public static IEnumerable<ApiResource> GetApiResources()
    {
        return new List<ApiResource>
        {
            new ApiResource("api", "MyApi") { ApiSecrets = { new Secret("secret".Sha256()) } }
        };
    }

ОБНОВЛЕНИЕ 2

Да У меня включена трассировка.Немного поиграв с кодом и переустановив пакеты, я теперь получаю другую ошибку. Запрос сделан для / connect / accesstokenvalidation.Эта конечная точка недоступна в IDS4

Microsoft.AspNetCore.Hosting.Internal.WebHost: Информация: запрос запуска HTTP / 1.1 POST http://localhost:44333/connect/accesstokenvalidation application / x-www-form-urlencoded 70 Microsoft.AspNetCore.Hosting.Internal.WebHost: Информация: запрос завершен за 3,405 мс 404 Microsoft.AspNetCore.Server.Kestrel: Информация: идентификатор соединения "0HLIJ9RBG591K", идентификатор запроса "0HLIJ9RBG591K: 0000000A": приложение выполнено без чтения всего тела запроса.

1 Ответ

0 голосов
/ 26 ноября 2018

OK Наконец, мне удалось решить эту проблему после 3 дней головной боли.

connect / accesstokenvalidation произошла из-за старой версии IdentityServer3.AccessTokenValidation.Я обновил его до версии 2.15.1, а также снизил версию System.IdentityModel.Tokens.Jwt до 4.0.2.206221351

. Я также добавил области действия в ApiResource, как показано ниже.Однако это может не потребоваться.Я еще не тестировал без него.

    public static IEnumerable<ApiResource> GetApiResources()
    {
        return new List<ApiResource>
        {
            new ApiResource("my_api", "SmartBiz Api")
            {
                ApiSecrets = { new Secret("secret".Sha256()) },
                Scopes =
                {
                    new Scope("the_api")
                }
            }
        };
    }

Спасибо за вашу помощь Росди Касим

...