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 ...
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
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.
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.
IdentityServer
est hébergé sur http://localhost:5000
- Lien vers launchSettings.json
JavaScriptClient
est hébergé sur le port http://localhost:5003
- Lien vers launchSettings.json
Api
est accessible à http://localhost:5002
- Lien vers launchSettings.json
Sachant cela, quelques paramètres de configuration entrent en jeu. allons ensemble sur eux.
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:
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.
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 Expressredirect_uri
et post_logout_redirect_uri
utilisent localhost:5003
, qui est l'URL du client JS lorsque nous utilisons IIS ExpressEncore 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.
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:
app.js
dans le client JS.Startup.cs
de l'APIStartup
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é ;-)
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
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.