Внутренний API Identity Server 4

Я использую Identity Server 4 и добавляю дополнительные конечные точки API, но не могу заставить его работать правильно. Когда я отправляю вызов API сервера идентификации с токеном доступа, он говорит

Microsoft.IdentityModel.Tokens.SecurityTokenInvalidAudienceException: IDX10214: Audience validation failed.

И претензии имени API не находятся в токене доступа. Я использую хранилища конфигурации БД.

Вот как я настроил Identity server 4.

Startup.cs

    services.Configure<EmailSettings>(Configuration.GetSection("EmailSettings"));

            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

            services.AddIdentity<ApplicationUser, IdentityRole>(options=>
                {
                    // example of setting options
                    options.Tokens.ChangePhoneNumberTokenProvider = "Phone";

                    // password settings chosen due to NIST SP 800-63
                    options.Password.RequiredLength = 3; // personally i'd prefer to see 10+
                    options.Password.RequiredUniqueChars = 0;
                    options.Password.RequireDigit = false;
                    options.Password.RequireLowercase = false;
                    options.Password.RequireUppercase = false;
                    options.Password.RequireNonAlphanumeric = false;
                })
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultTokenProviders();

            // Add application services.
            services.AddTransient<IEmailSender, EmailSender>();

            services.AddMvc();

            var migrationsAssembly = typeof(StartupDevelopment).GetTypeInfo().Assembly.GetName().Name;
            // configure identity server with in-memory stores, keys, clients and scopes
            services.AddIdentityServer(options =>
                    {
                        options.Discovery.CustomEntries.Add("Claims", "/api/claims");                         
                    }
                )                
                .AddDeveloperSigningCredential()
                .AddDeveloperSigningCredential()             
                .AddConfigurationStore(options =>
                {
                    options.ConfigureDbContext = builder =>
                        builder.UseSqlServer(Configuration.GetConnectionString("ConfigurationStore"),
                            sql => sql.MigrationsAssembly(migrationsAssembly));
                })                
                .AddOperationalStore(options =>
                {
                    options.ConfigureDbContext = builder =>
                        builder.UseSqlServer(Configuration.GetConnectionString("OperationalStore"),
                            sql => sql.MigrationsAssembly(migrationsAssembly));

                    // this enables automatic token cleanup. this is optional.
//                    options.EnableTokenCleanup = true;
//                    options.TokenCleanupInterval = 30;
                })               
                .AddAspNetIdentity<ApplicationUser>();

            services.AddAuthentication()
                .AddIdentityServerAuthentication("token", isAuth =>
                {
                    isAuth.Authority = IdentityServerConfigurations.Authority;
                    isAuth.ApiName = "claims"; // TODO change this name to refelect broader api changes
                    isAuth.RequireHttpsMetadata = IdentityServerConfigurations.Ssl;
                });

Config.cs

new Client
                {
                    ClientId = "mvc",
                    ClientName = "MVC Client",
                    AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,

                    RequireConsent = false,

                    AccessTokenLifetime = 300,                           
                    UpdateAccessTokenClaimsOnRefresh = true,                                                                    
                    ClientSecrets = 
                    {
                        new Secret("secret".Sha256())
                    },

                    RedirectUris = { "https://localhost:44383/signin-oidc" },
                    PostLogoutRedirectUris = { "https://localhost:44383/signout-callback-oidc" },


                    AllowedScopes =
                    {
                        IdentityServerConstants.StandardScopes.OpenId,
                        IdentityServerConstants.StandardScopes.Profile,
                        IdentityServerConstants.StandardScopes.Address,
                        "claims"                               
                    },
                    AllowOfflineAccess = true
                }

В ClaimsController

[Authorize(AuthenticationSchemes = "token")] 

person Epistemologist    schedule 06.03.2018    source источник
comment
Это класс запуска для вашего identityServer или API, защищенный IdentityServer?   -  person aaronR    schedule 06.03.2018
comment
Вы хотите, чтобы клиент MVC мог использовать Claims API?   -  person aaronR    schedule 06.03.2018
comment
Зачем ты это делаешь?   -  person aaronR    schedule 07.03.2018
comment
.AddIdentityServerAuthentication («токен»?   -  person aaronR    schedule 07.03.2018
comment
@aaronR Я пытаюсь добавить дополнительные точки на сервер идентификации, чтобы использовать другие функции. Этот запуск является классом запуска IdentityServer 4.   -  person Epistemologist    schedule 07.03.2018
comment
Класс запуска, который у вас есть, больше похож на то, что будет иметь API, а не на IdentityServer4.   -  person aaronR    schedule 07.03.2018
comment
Этот запуск больше похож на добавление других конечных точек API в вашу реализацию IdentityServer4, где ваш IdentityServer4 также будет размещать ваш API утверждений.   -  person aaronR    schedule 07.03.2018
comment
docs.identityserver.io/en/release/topics/add_apis.html   -  person Epistemologist    schedule 07.03.2018
comment
Где остальная часть вашего стартап-класса?   -  person aaronR    schedule 07.03.2018
comment
Полный код класса запуска см. в обновленном вопросе.   -  person Epistemologist    schedule 07.03.2018
comment
Давайте продолжим обсуждение в чате.   -  person Epistemologist    schedule 07.03.2018
comment
Попробуйте удалить вторую запись, чтобы добавить сертификат разработчика   -  person aaronR    schedule 07.03.2018
comment
Все та же проблема. IDX10214: Ошибка проверки аудитории.   -  person Epistemologist    schedule 07.03.2018


Ответы (2)


ОК, мне не хватало конфигурации для запроса области со стороны клиента.

options.Scope.Add("заявки");

services.AddAuthentication(options =>
                {
                    options.DefaultScheme = "Cookies";
                    options.DefaultChallengeScheme = "oidc";
                })
                .AddCookie("Cookies")                
                .AddOpenIdConnect("oidc", options =>
                {
                    options.Scope.Add("claims");
                };
person Epistemologist    schedule 07.03.2018

Здесь не видно реализации проверки токена, которая используется для «токена».

Вам необходимо реализовать обработчик проверки токена, если вы хотите, чтобы он мог использовать токен для доступа к пользовательскому API (с «токеном»).

Пожалуйста, ознакомьтесь с документацией, например, о том, как это делается:

http://docs.identityserver.io/en/release/topics/apis.html#refprotectingapis

person Aeseir    schedule 06.03.2018
comment
Я реализовал это с помощью документации. docs.identityserver.io/en/release/topics/add_apis.html - person Epistemologist; 07.03.2018
comment
Отлично, так что вы также внедрили проверку токена? Потому что это обязательное условие - person Aeseir; 07.03.2018
comment
Какая реализация токена. Я думаю, services.AddAuthentication() .AddIdentityServerAuthentication(token, isAuth =› { isAuth.Authority = localhost:44387; isAuth. ApiName = утверждения; isAuth.RequireHttpsMetadata = true; }); покрывает это - person Epistemologist; 07.03.2018
comment
Этот код должен заботиться о проверке токена, но я застрял при вставке аудитории в токен доступа. - person Epistemologist; 07.03.2018