API internal Server Identitas 4

Saya menggunakan Identity Server 4 dan menambahkan lebih banyak titik akhir API untuk digunakan tetapi sepertinya saya tidak dapat membuatnya berfungsi dengan benar. Ketika saya mengirim panggilan ke api server identitas dengan token akses, katanya

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

Dan Klaim nama API tidak ada dalam token akses. Saya menggunakan toko konfigurasi DB.

Di sini bagaimana saya mengkonfigurasi server Identitas 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
                }

Di ClaimsController

[Authorize(AuthenticationSchemes = "token")] 

person Epistemologist    schedule 06.03.2018    source sumber
comment
Apakah itu kelas startup untuk IdentityServer Anda atau API yang dilindungi di bawah IdentityServer?   -  person aaronR    schedule 06.03.2018
comment
Apakah Anda ingin klien MVC dapat menggunakan Claims API?   -  person aaronR    schedule 06.03.2018
comment
Mengapa kau melakukan ini?   -  person aaronR    schedule 07.03.2018
comment
.AddIdentityServerAuthentication("token" ?   -  person aaronR    schedule 07.03.2018
comment
@aaronR Saya mencoba menambahkan poin tambahan di server Identitas sehingga saya dapat menggunakan fungsi lain. Startup ini adalah kelas startup IdentityServer 4.   -  person Epistemologist    schedule 07.03.2018
comment
Kelas startup yang Anda miliki lebih mirip dengan apa yang dimiliki API dan bukan IdentityServer4   -  person aaronR    schedule 07.03.2018
comment
Startup itu lebih seperti menambahkan titik akhir API lainnya ke implementasi IdentityServer4 Anda di mana IdentityServer4 Anda juga akan menghosting API klaim Anda.   -  person aaronR    schedule 07.03.2018
comment
docs.identityserver.io/en/release/topics/add_apis.html   -  person Epistemologist    schedule 07.03.2018
comment
Di mana kelas startup Anda yang lain?   -  person aaronR    schedule 07.03.2018
comment
Silakan lihat pertanyaan yang diperbarui untuk kode kelas startup lengkap.   -  person Epistemologist    schedule 07.03.2018
comment
Mari kita melanjutkan diskusi ini dalam chat.   -  person Epistemologist    schedule 07.03.2018
comment
Coba hapus entri kedua untuk menambahkan sertifikat pengembang   -  person aaronR    schedule 07.03.2018
comment
Masalah masih sama. IDX10214: Validasi audiens gagal.   -  person Epistemologist    schedule 07.03.2018


Jawaban (2)


Oke, saya kehilangan konfigurasi untuk meminta cakupan dari sisi klien.

options.Scope.Add("klaim");

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

Tidak dapat melihat implementasi validasi token di sini, yang digunakan untuk "token".

Anda perlu mengimplementasikan Token Validation Handler jika ingin dapat menggunakan token untuk mengakses api khusus (dengan "token").

Silakan lihat dokumentasi misalnya tentang bagaimana hal ini dilakukan:

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

person Aeseir    schedule 06.03.2018
comment
Saya menerapkannya menggunakan dokumentasi. docs.identityserver.io/en/release/topics/add_apis.html - person Epistemologist; 07.03.2018
comment
Bagus jadi Anda juga menerapkan validasi token? Karena itu merupakan prasyarat - person Aeseir; 07.03.2018
comment
Implementasi token apa. Menurut saya services.AddAuthentication() .AddIdentityServerAuthentication(token, isAuth =› { isAuth.Authority = localhost:44387; isAuth. ApiName = klaim; isAuth.RequireHttpsMetadata = true; }); menutupinya - person Epistemologist; 07.03.2018
comment
Kode ini seharusnya menangani validasi token tetapi saya terjebak dalam memasukkan audiens ke dalam token akses. - person Epistemologist; 07.03.2018