Authentification asp .net core via IdentityServer4

Il n'y aura rien d'inhabituel ici, un framework IdentityServer4 s'authentifiera avec un nom d'utilisateur et un mot de passe sur un certain Api, en plus de gérer refresh_token.

Il fonctionnera avec le IdentityDbContext existant, IdentityUser.

Le résultat sera un scénario dans lequel, pour chaque authentification, un jeton refresh_token sera émis et stocké dans la table PersistedGrants. Il s'agit de l'un des quatre types d'autorisations OAuth 2.0:

Informations d'identification du mot de passe du propriétaire de la ressource: utilisées par les applications de confiance, telles que les applications qui font partie du service lui-même.

Tous les travaux de maintenance des jetons sont effectués par le framework.

Commençons donc.

Pour spécifier la méthode de résolution, des "clients" sont définis, j'en aurai un:

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 // - } 

Ensuite, ce client est placé dans la base de données lors de sa création:

TestIdentityServer.Program

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

Dans la méthode «Initialize», du code a été ajouté pour créer les bases de données nécessaires et insérer des données, y compris le client. Mais avant cela, il est nécessaire d'effectuer la migration, car vous devrez créer une base de données de 3 contextes, où le premier contexte est IdentityDbContext ApplicationUser et le reste pour IdentityServer4:

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(); } 

Migrations:

 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 

Un lien vers le code sera à la fin.

Allez-y. Après avoir configuré le client et créé la base de données, le serveur peut déjà traiter les demandes "/ connect / token" en se connectant avec un mot de passe et en émettant access_token avec refresh_token.
Selon lui, avec l'indication refresh_token, mettez-les à jour.

Nom d'utilisateur Mot de passe:

image

refresh_token

image

/ connect / userinfo

image

Ajoutez maintenant une API qui sera autorisée par IdentityServer4. Ses liens avec lui seront les suivants:

DataApi.Startup

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

L'API elle-même sera déployée sur un autre port.

L'autorisation sera désormais vérifiée comme d'habitude avec l'attribut "[Autoriser]".

/ api / par défaut

image



C'est tout, écrivez qui pense quoi ou ce qui manque.

Lien vers le code .

UPD: jetons Signature JWT

Méthodes de signature ajoutées: RSA qui est généré au démarrage et fichier de certificat * .pfx. La méthode correspondante peut être commutée sur "appsettings.json", propriété "SigningCredentialConfig".

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


All Articles