6

Otrzymuję poniższy błąd podczas wysyłania żądania do aplikacji serwera tożsamości z mojej aplikacji klienckiej JavaScript.Uzyskiwanie zakresu Sprawdzanie poprawności błędu w serwerze 4 tożsamości przy użyciu klienta JavaScript w rdzeniu asp.net

fail: IdentityServer4.Validation.ScopeValidator [0] Nieprawidłowy zakres: OpenID

Zrobiłem pewien dodam zakres w mojej aplikacji Identity Server. Poniżej znajduje się mój kod.

IdentityServer aplikacji (Host) Config.cs

public class Config 
{ 
    public static IEnumerable<ApiResource> GetApiResources() 
    { 
     return new List<ApiResource> 
     { 
      new ApiResource("api1","My API") 
     }; 
    } 

    public static IEnumerable<Client> GetClients() 
    { 
     return new List<Client> 
     { 
      new Client 
      { 
       ClientId = "js", 
       ClientName = "javaScript Client", 
       AllowedGrantTypes = GrantTypes.Implicit, 
       AllowAccessTokensViaBrowser = true, 
       RedirectUris = { "http://localhost:5003/callback.html" }, 
       PostLogoutRedirectUris = { "http://localhost:5003/index.html" }, 
       AllowedCorsOrigins = { "http://localhost:5003" }, 
       AllowedScopes = 
        { 
         IdentityServerConstants.StandardScopes.OpenId, 
         IdentityServerConstants.StandardScopes.Profile, 
         "api1" 
        } 
      } 
     }; 
    } 
} 

Startup.cs

public class Startup 
{ 
    // This method gets called by the runtime. Use this method to add services to the container. 
    // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940 
    public void ConfigureServices(IServiceCollection services) 
    { 

     services.AddIdentityServer() 
      .AddTemporarySigningCredential() 
      .AddInMemoryApiResources(Config.GetApiResources()) 
      .AddInMemoryClients(Config.GetClients()); 
    } 

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(); 

     if (env.IsDevelopment()) 
     { 
      app.UseDeveloperExceptionPage(); 
      app.UseIdentityServer(); 
     } 

     app.Run(async (context) => 
     { 
      await context.Response.WriteAsync("Hello World!"); 
     }); 
    } 
} 

Web API Startup.cs

public class Startup 
{ 
    public Startup(IHostingEnvironment env) 
    { 
     var builder = new ConfigurationBuilder() 
      .SetBasePath(env.ContentRootPath) 
      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true); 

     if (env.IsEnvironment("Development")) 
     { 
      // This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately. 
      builder.AddApplicationInsightsSettings(developerMode: true); 
     } 

     builder.AddEnvironmentVariables(); 
     Configuration = builder.Build(); 
    } 

    public IConfigurationRoot Configuration { get; } 

    // This method gets called by the runtime. Use this method to add services to the container 
    public void ConfigureServices(IServiceCollection services) 
    { 
     // Add framework services. 
     services.AddApplicationInsightsTelemetry(Configuration); 

     services.AddCors(option => 
     { 
      option.AddPolicy("dafault", policy => 
      { 
       policy.WithOrigins("http://localhost:5003") 
         .AllowAnyHeader() 
         .AllowAnyMethod(); 
      }); 
     }); 
     services.AddMvcCore() 
       .AddAuthorization() 
       .AddJsonFormatters(); 
    } 

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline 
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

     //this uses the policy called "default" 
     app.UseCors("default"); 

     app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions 
     { 
      Authority = "http://localhost:5000", 
      AllowedScopes = { "api1" }, 
      RequireHttpsMetadata = false 
     }); 

     app.UseApplicationInsightsRequestTelemetry(); 

     app.UseApplicationInsightsExceptionTelemetry(); 

     app.UseMvc(); 
    } 
} 
+0

im napotykając ten sam błąd podczas stosowania tej samej próbki w dokumentacji. czy miałeś szczęście? – alessalessio

Odpowiedz

17

Gdy klient (aplikacja) jest skonfigurowany lub mogą zażądać zasób openid (lub zakres), serwer tożsamość nie jest skonfigurowany dla zasobu tożsamości OpenID

Trzeba dodać go jako źródło tożsamości podobny do jak to zrobić here i mieć metodę, która zwraca wszystkie zasoby tożsamości, które chcesz użyć, tak jak zrobione here.

W skrócie dodać nową metodę do Config.cs który wygląda następująco:

public static List<IdentityResource> GetIdentityResources() 
{ 
    return new List<IdentityResource> 
    { 
     new IdentityResources.OpenId() 
     new IdentityResources.Profile() // <-- usefull 
    } 
} 

a następnie do identityservers pojemnik usługa dodać swoją konfigurację zasobów tożsamości tak:

services.AddIdentityServer() 
    .AddTemporarySigningCredential() 
    .AddInMemoryApiResources(Config.GetApiResources()) 
    .AddInMemoryClients(Config.GetClients()); 
    .AddInMemoryIdentityResources(Config.GetIdentityResources()) // <-- adding identity resources/scopes 
+0

Działa teraz, ale teraz wyświetla się Pokazuje login: Użytkownik nie jest uwierzytelniony – maxspan

+0

Logi są twoim przyjacielem, czy twoja konsola rejestruje się na poziomie śledzenia? – Lutando

+0

tak. To pokazuje IdentityServer4.ResponseHandling.AuthorizeInteractionResponseGenerator [0] Użytkownik nie jest uwierzytelniony. Jak uwierzytelnić użytkownika? – maxspan