1. Instancia de credenciales de cliente
① Preparación
Para instalar la plantilla, abra una ventana de consola y escriba el siguiente comando:
dotnet new -i IdentityServer4.Templates
Después de la instalación, habrá tan pocas plantillas de servidor de identidad
Elegimos la plantilla de Tiendas en memoria y Usuarios de prueba para guardar la información en la memoria
② Crear un proyecto de plantilla de Almacenes en memoria y Usuarios de prueba
dotNET nuevo nombre is4inmem - myService
Se generarán varias categorías de clientes en el archivo de configuración, este caso intentará
Luego configuramos el puerto de inicio del servicio en 5000
③ Crear un cliente
Escriba un cliente que solicite un token de acceso, cree una aplicación de consola y configure el puerto de inicio en 5002
Agregar paquete IdentityModel
Leer la dirección del punto final real de los metadatos
// descubre puntos finales de metadatos var client = new HttpClient (); var disco = espera cliente. GetDiscoveryDocumentAsync ( " http: // localhost: 5000 " ); if (disco.IsError) { Console.WriteLine (disco.Error); volver ; }
A continuación, puede usar la información en el documento de descubrimiento para solicitar un token de IdentityServer para accederapi1
// token de solicitud var tokenResponse = esperar cliente.RequestClientCredentialsTokenAsync ( nuevo ClientCredentialsTokenRequest { Address = disco.TokenEndpoint, ClientId = " client " , ClientSecret = " secret " , Scope = " api1 " }); if (tokenResponse.IsError) { Console.WriteLine (tokenResponse.Error); volver ; } Console.WriteLine (tokenResponse.Json);
Enviar token de acceso a la API, acceder a la API
// llamar a api var apiClient = new HttpClient (); apiClient.SetBearerToken (tokenResponse.AccessToken); respuesta var = aguarda apiClient.GetAsync ( " http: // localhost: 5001 / identity " ); if (! response.IsSuccessStatusCode) { Console.WriteLine (response.StatusCode); } else { var content = await response.Content.ReadAsStringAsync (); Console.WriteLine (JArray.Parse (contenido)); }
④Definir recursos API
Cree un proyecto de API y configure el puerto de inicio en 5001
Agregar una nueva clase llamadaIdentityController
[Ruta ( " identidad " )] [Autorizar] clase pública IdentityController: ControllerBase { [HttpGet] public IActionResult Get () { return new JsonResult ( de c en User.Claims seleccione new {c.Type, c.Value}); } }
Luego agregue permiso de acceso [Autorizar] en el controlador
El último paso es agregar el servicio de autenticación a DI (Inyección de dependencia) y agregar el middleware de autenticación a la tubería. Estos:
- Verifique el token entrante para asegurarse de que proviene de un emisor confiable
- Verifique que el token se pueda usar con esta API (también llamada audiencia)
Inicio de clase pública { public void ConfigureServices (servicios IServiceCollection) { services.AddControllers (); services.AddAuthentication ( " Bearer " ) .AddJwtBearer ( " Bearer " , options => { options.Authority = " http: // localhost: 5000 " ; options.RequireHttpsMetadata = false ; options.Audience = " api1 " ; }); } public void Configure (aplicación IApplicationBuilder) { app.UseRouting (); app.UseAuthentication (); app.UseAuthorization (); app.UseEndpoints (puntos finales => { endpoints.MapControllers (); }); } }
AddAuthentication
Agregue el servicio de autenticación a DI y configúreloBearer
como el esquema predeterminado.UseAuthentication
Agregue middleware de autenticación a la tubería para que cada llamada al host realice la autenticación automáticamente.UseAuthorization
Se agregó middleware de autorización para garantizar que los clientes anónimos no puedan acceder a nuestros puntos finales API.
http://localhost:5001/identity
Navegar al controlador en el navegador debería devolver un código de estado 401. Esto significa que su API requiere credenciales y ahora está protegida por IdentityServer.
Referencias: https://identityserver4.readthedocs.io/en/latest/quickstarts/1_client_credentials.html