Authentifizierung asp .net Kern über IdentityServer4

Es wird nichts Ungewöhnliches geben, ein IdentityServer4-Framework authentifiziert sich mit einem Benutzernamen und einem Kennwort auf einer bestimmten API und behandelt das Aktualisierungs-Token.

Es funktioniert mit dem vorhandenen IdentityDbContext, IdentityUser.

Das Ergebnis ist ein Szenario, in dem für jede Authentifizierung ein refresh_token ausgegeben und in der PersistedGrants-Tabelle gespeichert wird. Dies ist eine von vier Arten von OAuth 2.0-Berechtigungen:

Anmeldeinformationen für das Kennwort des Ressourcenbesitzers: Wird von vertrauenswürdigen Anwendungen verwendet, z. B. von Anwendungen, die Teil des Dienstes selbst sind.

Alle Token-Wartungsarbeiten werden vom Framework durchgeführt.

Also fangen wir an.

Um die Auflösungsmethode anzugeben, werden "Clients" festgelegt. Ich habe eine:

DataLayer.Config

new Client { ClientId = _configurationManager.Value.ClientId, AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, //   RequireClientSecret = false, //Client Secret    ,  AllowedScopes = { _configurationManager.Value.ApiName, IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile},//      /connect/userinfo AllowOfflineAccess = true // - } 

Als Nächstes befindet sich dieser Client beim Erstellen in der Datenbank:

TestIdentityServer.Program

 services.GetRequiredService<DbInitializer>().Initialize(); 

Bei der Methode "Initialisieren" wurde Code hinzugefügt, um die erforderlichen Datenbanken zu erstellen und Daten, einschließlich des Clients, einzufügen. Zuvor müssen Sie jedoch die Migration durchführen, da Sie eine Datenbank mit drei Kontexten erstellen müssen, wobei der erste Kontext IdentityDbContext ApplicationUser und der Rest IdentityServer4 ist:

DataLayer.DbInitializer

  _context.Database.Migrate(); _configurationDbContext.Database.Migrate(); _persistedGrantDbContext.Database.Migrate(); 

  if (!_configurationDbContext.Clients.Any()) { foreach (var client in _config.GetClients().ToList()) { _configurationDbContext.Clients.Add(client.ToEntity()); } _configurationDbContext.SaveChanges(); } 

Migrationen:

 dotnet ef migrations add InitialIdentityServerPersistedGrantDbMigration -c PersistedGrantDbContext -o Data/Migrations/IdentityServer/PersistedGrantDb dotnet ef migrations add InitialIdentityServerConfigurationDbMigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/ConfigurationDb dotnet ef migrations add InitialAuthMigration -c AuthContext -o Data/Migrations/IdentityServer/Auth 

Ein Link zum Code befindet sich am Ende.

Mach weiter. Nach dem Festlegen des Clients und dem Erstellen der Datenbank kann der Server bereits Anforderungen "/ connect / token" verarbeiten, indem er sich mit einem Kennwort anmeldet und access_token mit refresh_token ausgibt.
Aktualisieren Sie sie entsprechend mit der Angabe refresh_token.

Login: Passwort:

Bild

refresh_token

Bild

/ connect / userinfo

Bild

Fügen Sie nun eine API hinzu, die von IdentityServer4 autorisiert wird. Seine Verbindung mit ihm wird wie folgt sein:

DataApi.Startup

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

Die API selbst wird an einem anderen Port bereitgestellt.

Die Autorisierung wird nun wie gewohnt mit dem Attribut "[Autorisieren]" überprüft.

/ api / Standard

Bild



Das ist alles, schreibe, wer denkt was oder was fehlt.

Link zum Code .

UPD: Signatur-JWT-Token

Signaturmethoden hinzugefügt: RSA, das beim Start generiert wird, und * .pfx-Zertifikatdatei. Die entsprechende Methode kann auf "appsettings.json", Eigenschaft "SigningCredentialConfig" umgeschaltet werden.

Source: https://habr.com/ru/post/de426289/


All Articles