Токен от подключения к серверу идентификации \ токен недействителен для моего API

Я получаю токен с моего сервера идентификации 4 через URL-адрес соединения / токен с запросом POST:

Затем я копирую / вставляю значение ключа access_token в свой запрос API GET в качестве заголовка:

mytokenstring

eyJhbGciOiJSUzI1NiIsImtpZCI6IkYxMDhCODA2NUNFMTRBOEEwOTZBODUyMkIxQUNBMkFDMTdEQjQwNEEiLCJ0eXAiOiJKV1QiLCJ4NXQiOiI4UWk0Qmx6aFNvb0phb1Vpc2F5aXJCZmJRRW8ifQ.eyJuYmYiOjE1MDg1OTU5MzIsImV4cCI6MTUwODU5OTUzMiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo2NTUzNSIsImF1ZCI6WyJodHRwOi8vbG9jYWxob3N0OjY1NTM1L3Jlc291cmNlcyIsInRlYWNoZXJzX3Rlc3RfcGxhbm5lciJdLCJjbGllbnRfaWQiOiJ0ZWFjaGVyc190ZXN0X3BsYW5uZXIiLCJzY29wZSI6WyJ0ZWFjaGVyc190ZXN0X3BsYW5uZXIiXX0.g2x31JcYrXyIavfxCu7UKY3kndznI_gYHJYCxl0dQn3u7l7vWo6qKr13XYMo6P1Lqtu68T2FEXL-5kyS0XwFClpdJE6m13-hfKZsd2QHBmOlgZ2ANwghXW4hfU5nWiwkUACwkP9wfDCULV3oQm5i49L5TQmUiiqcy0TTS2FDBdS5ymFBi1bCKnPh5ErsD8V_4eTqLzxv8CyVkPx2gPd6aBIf_2JNrjrMrrm69kghOHnktVG17KPQhppbIeJO8RP-URiJUJGXIY09yRGVF7YXtkFj-I5QOMvNIAWgUeqNYqH0cuQol9nglA4mtU1MfXtnRoEpRRzGViw7gxJ_-MFadA

Авторизация: предъявитель mytokenstring

Что может привести к тому, что токен с сервера идентификации недействителен для моего API?

Я получаю сообщение об ошибке 401 с помощью POSTMAN

Глядя на вывод сервера пустельги, я получаю следующее:

Api> fail: Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware[0]
Api>       'MS-ASPNETCORE-TOKEN' does not match the expected pairing token '52da49ee-6599-483a-b97a-15ced1603005', request rejected.

Что я не так и что это за токен сопряжения Guid?

API HttpGet:

заголовок:

Носитель авторизации eyJh ... UntilTheEndOfTheString

Настройка IdentityServer:

public void ConfigureServices(IServiceCollection services)
{
    string certificateFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "certifiateselfsigned.pfx");

    var certificate = new X509Certificate2(certificateFilePath, "test");

    services.AddIdentityServer()
    .AddSigningCredential(certificate)
        .AddInMemoryApiResources(InMemoryConfiguration.GetApiResources())
        .AddInMemoryClients(InMemoryConfiguration.GetClients())
        .AddTestUsers(InMemoryConfiguration.GetUsers());

    services.AddMvc();
}

ОБНОВЛЕНИЕ

API

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(options =>
    {
        options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;

        })
            .AddIdentityServerAuthentication(opt =>
           {
               opt.RequireHttpsMetadata = false;
               opt.Authority = "http://localhost:65535"; // IdentityProvider => port running IDP on
               opt.ApiName = "teachers_test_planner"; // IdentityProvider => api resource name
           });

    services.AddMvc();
}

IdentityProvider

public static class InMemoryConfiguration
{
    public static List<TestUser> GetUsers()
    {
        return new List<TestUser>
    {
        new TestUser{ SubjectId = "6ed26693-b0a1-497e-aa14-7b880536920f", Username = "[email protected]", Password = "mypassword",
            Claims = new List<Claim>
            {
                new Claim("family_name", "tatum")
            }
        }
    };
    }

    public static IEnumerable<ApiResource> GetApiResources()
    {
        return new List<ApiResource>
    {
        new ApiResource("teachers_test_planner", "Mein Testplaner")
    };
    }

    public static IEnumerable<IdentityResource> GetIdentyResources()
    {
        return new List<IdentityResource>
    {
        new IdentityResources.OpenId(),
        new IdentityResources.Profile(),
    };
    }

    public static IEnumerable<Client> GetClients()
    {
        return new List<Client>
    {
        new Client
        {
            ClientId = "teachers_test_planner",
            ClientSecrets = new[]{ new Secret("secret".Sha256()) },
            AllowedGrantTypes = GrantTypes.ResourceOwnerPasswordAndClientCredentials,
            AllowedScopes = new []{ "teachers_test_planner" }
        }
    };
    }
}

ОБНОВЛЕНИЕ 2

Вы можете найти тестовый проект здесь:

https://github.com/LisaTatum/IdentityServer4Test

ОБНОВЛЕНИЕ 3

Поскольку никто не спрашивал, как я делаю http_post для конечной точки подключения / токена, вот он:

введите описание изображения здесь


person Elisabeth    schedule 11.10.2017    source источник
comment
какой json возвращается из вашего сообщения POST? а затем что вы используете из POST для своего GET?   -  person Aaron. S    schedule 11.10.2017
comment
обновлен с дополнительной информацией. Проверьте токен здесь: jwt.io/#debugger ;-)   -  person Elisabeth    schedule 11.10.2017
comment
вы передаете все, кроме кавычек для этого access_token?   -  person Aaron. S    schedule 11.10.2017
comment
без кавычек да! Проблема также не в сроке действия ... моя дикая догадка выглядит примерно так: github.com / IdentityServer / IdentityServer3 / issues / 703 цитата: Хорошо, ваша ошибка указывает на то, что SSL-сертификат, используемый IdentityServer, не является доверенным для проверки токена из проекта веб-API на IdentityServer. IOW, вам необходимо установить доверие компьютера к вашему сертификату SSL (а не просто щелкнуть игнорировать ошибку SSL в браузере).   -  person Elisabeth    schedule 11.10.2017
comment
извините за глупые вопросы, но нужно убедиться. такое бывает с почтальоном? а приложение, которое вы создали?   -  person Aaron. S    schedule 11.10.2017
comment
Я НЕ использовал IdentityServer, поэтому мои знания расплывчаты. Вы проверили журналы ошибок для IdentityServer (если они существуют)? Просмотрщик событий? где-нибудь еще, кроме того, о чем сообщает почтальон?   -  person Aaron. S    schedule 11.10.2017
comment
да с почтальоном. Я создал самозаверяющий сертификат для сервера идентификации, который помещается в мою учетную запись пользователя в хранилище данных, поэтому я вообще смог сделать запрос Post на / connect / token. Сертификат устранил эту проблему.   -  person Elisabeth    schedule 11.10.2017
comment
У меня нет дополнительной информации для регистрации!   -  person Elisabeth    schedule 11.10.2017
comment
установленный сертификат позволил вам публиковать сообщения, но не устранил проблему?   -  person Aaron. S    schedule 11.10.2017
comment
установленный сертификат просто позволил мне отправить сообщение «да». Но, может быть, мне еще нужно с этим заняться ... не знаю.   -  person Elisabeth    schedule 11.10.2017
comment
Извините, я больше ничем не могу помочь, может быть, всего этого будет достаточно, чтобы кто-то более разбирающийся в IdentityServer мог помочь   -  person Aaron. S    schedule 12.10.2017
comment
У вас есть отдельный проект API от проекта IdentityServer4?   -  person aaronR    schedule 20.10.2017
comment
2 проекта. IdentityProvider и проект Api.   -  person Elisabeth    schedule 20.10.2017


Ответы (2)


Все, что вы пропустили, это app.UseAuthentication(). Вы должны добавить это в Configure метод на Api startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(); // Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    app.UseAuthentication();// The missing line

    app.UseStaticFiles();

    app.UseMvc();
}

Я пишу следующее консольное приложение, чтобы протестировать вызов вашего api

class Program
{
    public static void Main(string[] args) => MainAsync().GetAwaiter().GetResult();

    private static async Task MainAsync()
    {
        // discover endpoints from metadata
        var disco = await DiscoveryClient.GetAsync("http://localhost:65535");
            
        // request token
        var tokenClient = new TokenClient(disco.TokenEndpoint, "teachers_test_client", "secret");
        var tokenResponse = await tokenClient.RequestClientCredentialsAsync("teachers_test_planner");

        if (tokenResponse.IsError)
        {
            Console.WriteLine(tokenResponse.Error);
            return;
        }

        Console.WriteLine(tokenResponse.Json);
        Console.WriteLine("\n\n");

        // call api
        var client = new HttpClient();
        client.SetBearerToken(tokenResponse.AccessToken);

        var response = await client.GetAsync("http://localhost:52129/api/values/1");
        if (!response.IsSuccessStatusCode)
        {
            Console.WriteLine(response.StatusCode);
        }
        else
        {
            var content = await response.Content.ReadAsStringAsync();
            Console.WriteLine(content);
        }
        Console.ReadKey();
    }
}

Вы можете примерить почтальона, я не пробовал

Однако мне пришлось изменить еще несколько вещей в вашем проекте (github), чтобы он работал на моей машине. И они

Проект: IdentityProvider

  • mytestplanner.pfx не был установлен на Всегда копировать

Проект: Api2

  • удалить пакет IdentityServer4. Зачем вам нужен IdentityServer4 на клиенте?
  • Измените целевую структуру с <TargetFramework>net462</TargetFramework> на <TargetFramework>netcoreapp2.0</TargetFramework> (причина в том, что 4.6.2 не установлена ​​на моем компьютере)

В любом случае, дайте мне знать, работает ли это для вас

Обновлять

Я добавил рабочий проект сюда

person MJK    schedule 25.10.2017
comment
Я попробовал его на своем производственном решении, и он там работает, спасибо. Проверено почтальоном. Я просто добавил AddIdentityServerAuthentication, а не app.UseAuthentication ... другие исправления связаны с ошибками копирования / вставки из производства в тестовое решение github :-) - person Elisabeth; 25.10.2017
comment
Рад, что это сработало для вас. @ Элизабет, спасибо за награду, это моя первая заработанная награда :) - person MJK; 25.10.2017

Это может произойти, если вы запросите «неправильный» токен.

Предполагая, что у вас есть клиент C, вызывающий API A, "POST GetToken" будет выглядеть примерно так:

  • ClientId: C.ClientId
  • Ресурс: A.Resource («аудитория»)

Ваш токен предполагает, что вы выполняете следующий запрос

Является ли "http://localhost:65535/resources" аудиторией вашего целевого API?

person Alex AIT    schedule 20.10.2017
comment
извините, Алекс, я думал, что опубликовал весь код ... Я обновил свой вопрос, добавив дополнительную информацию. - person Elisabeth; 21.10.2017
comment
Посмотрите, может ли это устранить ошибку пустельги в вашем журнале: stackoverflow.com/questions/38839034/, не могли бы вы снова добавить свой пример токена? Также попробуйте переименовать своего клиента teacher_test_client, сохранив при этом область видимости и api. Наконец, попробуйте удалить сертификат из вашей установки, чтобы уменьшить возможные источники ошибок: .AddSigningCredential - person Alex AIT; 21.10.2017
comment
Токен добавлен снова. Переименовал clientId в «Teacher_test_client». Удалил сертификат с помощью AddSigningCredential и получил эту ошибку: ‹h2 class = stackerror› InvalidOperationException: учетные данные для подписи не настроены. Невозможно создать токен JWT ‹/h2› - person Elisabeth; 21.10.2017
comment
Сегодня вечером выложу тестовый проект на github :-) - person Elisabeth; 21.10.2017