Autenticación asp .net core a través de IdentityServer4

No habrá nada inusual, un marco IdentityServer4 se autenticará con un nombre de usuario y una contraseña en una determinada Api, además de manejar refresh_token.

Funcionará con el IdentityDbContext existente, IdentityUser.

El resultado será un escenario en el que, para cada autenticación, se emitirá un refresh_token y se almacenará en la tabla PersistedGrants. Este es uno de los cuatro tipos de permisos de OAuth 2.0:

Credenciales de contraseña del propietario del recurso: Usado por aplicaciones confiables, como las aplicaciones que forman parte del servicio en sí.

Todo el trabajo de mantenimiento de tokens es realizado por el marco.

Entonces comencemos.

Para especificar el método de resolución, se establecen "clientes", tendré uno:

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

A continuación, este cliente se asienta en la base de datos cuando se crea:

TestIdentityServer.Program

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

En el método "Inicializar", se ha agregado código para crear las bases de datos necesarias e insertar datos, incluido el cliente. Pero antes de eso, debe realizar la migración, ya que tendrá que crear una base de datos de 3 contextos, donde el primer contexto es IdentityDbContext ApplicationUser y el resto para 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(); } 

Migraciones:

 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 enlace al código estará al final.

Adelante Después de configurar el cliente y crear la base de datos, el servidor ya puede procesar las solicitudes "/ connect / token" iniciando sesión con una contraseña y emitiendo access_token con refresh_token.
Según esto, con la indicación refresh_token, actualícelos.

Nombre de usuario Contraseña:

imagen

refresh_token

imagen

/ connect / userinfo

imagen

Ahora agregue una API que será autorizada por IdentityServer4. Su conexión con él será la siguiente:

DataApi.Startup

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

La API misma se desplegará en otro puerto.

La autorización ahora se verificará como de costumbre con el atributo "[Autorizar]".

/ api / Predeterminado

imagen



Eso es todo, escribe quién piensa qué o qué falta.

Enlace al código .

UPD: tokens de firma jwt

Métodos de firma añadidos: RSA que se genera al inicio y archivo de certificado * .pfx. El método correspondiente se puede cambiar a "appsettings.json", propiedad "SigningCredentialConfig".

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


All Articles