web-dev-qa-db-fra.com

Échec du chargement de http: // localhost: 5000/.well-known/openid-configuration: aucun en-tête 'Access-Control-Allow-Origin' n'est présent sur la ressource demandée.

Je suis un débutant chez identityserver4. Récemment, j'ai vu l'exemple Quickstart8 fourni par l'équipe identityserver. Dans ce projet, 3 projets sont inclus: 1.Identityserver 2. Api 3.Client tout fonctionne bien dans le navigateur lorsque je me suis déployé sur iis, ils ne fonctionnent pas correctement, il affiche une erreur comme ...

 enter image description here

J'utilise un client javascript ...

S'il vous plaît aidez-moi avec ce problème.

Ceci est mon code ...

Api (startup.cs)

using Microsoft.AspNetCore.Builder;

using Microsoft.Extensions.DependencyInjection;

namespace Api { public class Startup { public void ConfigureServices (services IServiceCollection) { services.AddMvcCore () .AddAuthorization () .AddJsonFormatters ();

        services.AddAuthentication("Bearer")
            .AddIdentityServerAuthentication(options =>
            {
                options.Authority = "http://localhost:5000";
                options.RequireHttpsMetadata = false;

                options.ApiName = "api1";
            });

        services.AddCors(options =>
        {
            // this defines a CORS policy called "default"
            options.AddPolicy("default", policy =>
            {
                policy.WithOrigins("http://localhost:5003")
                    .AllowAnyHeader()
                    .AllowAnyMethod();
            });
        });
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseCors("default");

        app.UseAuthentication();

        app.UseMvc();
    }
}

}

Api (Identity Controller)

[Route("[controller]")]
[Authorize]
public class IdentityController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        return new JsonResult(from c in User.Claims select new { c.Type, c.Value });
    }
}

QuickstartIdentityServer (startup.cs)

 public class Startup
{


    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        string connectionString = @"Data Source=DOTNET-Foo;Initial Catalog=IdentityServer4;Integrated Security=True";
        var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;

        // configure identity server with in-memory stores, keys, clients and scopes
        services.AddIdentityServer()
            .AddDeveloperSigningCredential()
            .AddTestUsers(Config.GetUsers())
            // this adds the config data from DB (clients, resources)
            .AddConfigurationStore(options =>
            {
                options.ConfigureDbContext = builder =>
                    builder.UseSqlServer(connectionString,
                        sql => sql.MigrationsAssembly(migrationsAssembly));
            });
            // this adds the operational data from DB (codes, tokens, consents)
            //.AddOperationalStore(options =>
            //{
            //    options.ConfigureDbContext = builder =>
            //        builder.UseSqlServer(connectionString,
            //            sql => sql.MigrationsAssembly(migrationsAssembly));

        //    // this enables automatic token cleanup. this is optional.
        //    options.EnableTokenCleanup = true;
        //    options.TokenCleanupInterval = 30;
        //});

        services.AddAuthentication()
            .AddGoogle("Google", options =>
            {
                options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;

                options.ClientId = "434483408261-55tc8n0cs4ff1fe21ea8df2o443v2iuc.apps.googleusercontent.com";
                options.ClientSecret = "3gcoTrEDPPJ0ukn_aYYT6PWo";
            })
            .AddOpenIdConnect("oidc", "OpenID Connect", options =>
            {
                options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
                options.SignOutScheme = IdentityServerConstants.SignoutScheme;

                options.Authority = "https://demo.identityserver.io/";
                options.ClientId = "implicit";

                options.TokenValidationParameters = new TokenValidationParameters
                {
                    NameClaimType = "name",
                    RoleClaimType = "role"
                };
            });

    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
           // IdentityServerDatabaseInitialization.InitializeDatabase(app);
        }
        app.UseIdentityServer();
        app.UseStaticFiles();
        app.UseMvcWithDefaultRoute();
    }
}

Je ne suis pas en mesure d'accéder àhttp: // localhost: 5000/.well-known/openid-configuration

 enter image description here

2
DotNetLover

Je pense que l'exemple ne fonctionne plus lorsque vous exécutez les projets à partir de IIS, car les adresses, ou plus précisément les ports, ne sont pas les mêmes.

Ports utilisés lors de l'exécution dans IIS Express

Lorsque vous exécutez les projets via Visual Studio ou utilisez dotnet run, l'URL sur laquelle le projet est hébergé est générée par un fichier appelé launchSettings.json dans le dossier Properties de votre projet.

Configuration associée

Sachant cela, quelques paramètres de configuration entrent en jeu. allons ensemble sur eux.

Paramètres client dans IdentityServer

Lorsque vous définissez un client (c'est-à-dire une application qui fédérera son authentification auprès d'IdentityServer), vous devrez spécifier quelques éléments, tels que:

  • à quelle (s) URL (s) IdentityServer est-il autorisé à rediriger l'utilisateur après la connexion ou la déconnexion;
  • s'il s'agit d'un client JS, à partir de quelle (s) URL (s) le navigateur doit-il être autorisé à lancer une demande d'autorisation

Cela peut être trouvé dans la Config classe ici .

Vous remarquerez que toutes les URL spécifiées dans cette configuration indiquent l'emplacement où la variable JavaScriptClient est hébergée lors de l'utilisation de IIS Express; vous devrez les mettre à jour avec l'URL du client JS lors du déploiement sur IIS.

Configuration JS

Comme dans cet exemple, le client JS adresse une demande directement à IdentityServer, certains paramètres sont définis dans l'application JS elle-même. nous pouvons les trouver dans le fichier app.js :

  • authority est l'URL IdentityServer - localhost:5000 est correct lorsque nous utilisons IIS Express
  • redirect_uri et post_logout_redirect_uri utilisent localhost:5003, qui est l'URL du client JS lorsque nous utilisons IIS Express

Encore une fois, vous devrez mettre à jour toutes ces valeurs pour qu'elles correspondent aux URL où les deux applications sont hébergées lorsque vous utilisez IIS.

Configuration de l'API

Cet exemple montre comment le client JS peut envoyer une requête à l'API et l'envoyer au jeton à IdentityServer pour le valider.

Il y a quelques paramètres impliqués ici:

  • Le client JS doit connaître l'URL de l'API - elle est définie à nouveau dans app.js dans le client JS.
  • L'API doit savoir comment accéder à IdentityServer - nous le trouverons dans Startup.cs de l'API
  • L'API doit autoriser le navigateur, via une stratégie CORS, à envoyer une requête AJAX à ses points de terminaison, ce qui est à nouveau effectué dans la classe Startup dans le projet API.

Une fois de plus, vous devrez mettre à jour toutes ces URL pour qu'elles correspondent à celles utilisées lors du déploiement de vos projets sur IIS.

Espérons que je n'ai rien manqué ;-)

1
Mickaël Derriey

Enfin, j'ai résolu le problème en donnant l'autorisation de connexion SQL pour la connexion a échoué pour l'utilisateur 'IIS APPPOOL\IdServe 

0
DotNetLover

Vous n'avez rien de spécial à faire ici, ISD4 gère correctement CORS. Vous devez spécifier http: // localhost: 5003 dans les origines CORS pour votre configuration client. IDS4 le détectera et autorisera la requête vers le noeud final de découverte. 

0
mackie