Germán Küber

Blockchain Developer / Microsoft Architect

Instalando nuestro propio token service (IdentityServer3)

Antes de comenzar con la instalación y configuración de nuestro servidor de token, es necesario repasar algunos conceptos que seran sumamente necesarios para comprender el flujo de trabajo. 

Cliente: 

No debemos confundir este termino con nuestros clientes finales. Cuando hablemos de clientes, vamos  a estar haciendo referencia a todas las aplicaciones que se conectan a nuestro servicio y que consumen nuestros tokens. 
A la hora de definir nuestros distintos clientes (nativo, web, user-agentetc), definiremos diferentes flujos (por lo general tendremos diferentes flujos de trabajo según nuestro tipo de clientes) 

Scope: 

Cuando hablamos de scope, estamos hablando del alcance de los recursos (como puede ser la dirección de email, el nombre). 
Una forma de mirar el scope, es considerarlo como la intención del cliente, por ejemplo el cliente quiere acceder a un recurso especifico o solicita información sobre una api. 

Usuarios: 

Estos son los usuarios finales, como tu y yo, estos usuarios pueden encontrarse en una DB propia o pueden ser credenciales de Facebook, Office365, Microsoft, etc. 

Dicho esto podemos comenzar con la configuración de nuestro servidor de tokens. 

Comenzamos creando un proyecto web vacío. 
Como paso siguiente debemos  especificarle a nuestro aplicación que vamos a estar utilizando ssl (esto se debe a que de ahora en mas trabajaremos con credenciales). 

En las propiedades de nuestra aplicación establecemos que utilice ssl. 

Imagen 

También cambiamos la url de nuestro proyecto para que sea consumido con https: 

Imagen 

Además es necesario especificar en nuestro web.config el siguiente atributo para que todos los módulos administrados se ejecuten para todas las solicitudes : 

Imagen 

Ahora instalamos los paquetes necesarios. 

  1. Install-Package Microsoft.Owin.Host.SystemWeb 

  1. Install-Package Thinktecture.IdentityServer3 

Ahora vamos a comenzar a configurar nuestra aplicación, esta configuración es base, dado que depende los flujos de trabajo implementados, esta será un poco diferente.

Creamos una clase clientes, la cual especificara los clientes que se conecten a nuestro servidor y definira los flujos de trabjao de cada uno de ellos.

 public static class Clients
    {
        public static IEnumerable Get()
        {
            return new[]
             {
                new Client 
                {
                     Enabled = true,
                     ClientId = "mvc",
                     ClientName = "Aplicacion MVC Client (Hybrid Flow)",
                     Flow = Flows.Hybrid, 
                     RequireConsent = true,  
                    RedirectUris = new List
                    {
                        ExpenseTrackerConstants.ExpenseTrackerClient
                    }
                 }
             };

        }
    }


Ahora vamos a configurar nuestra clase clientes, en nuestro ejemplo utilizaremos usuarios en memoria para no generar complejidad extra sobre nuestro ejemplo, pero cabe aclarar que IdentityServer3, soporta diferentes almacenes de datos como puede ser sql.

 public static class Users
    {
        public static List Get()
        {
            return new List() {
           
               new InMemoryUser
            {
                Username = "Kevin",
                Password = "secret",
                Subject = "1",

                Claims = new[]
                {
                    new Claim(Constants.ClaimTypes.GivenName, "Kevin"),
                    new Claim(Constants.ClaimTypes.FamilyName, "Dockx"),
               }
            }
            ,
            new InMemoryUser
            {
                Username = "Sven",
                Password = "secret",
                Subject = "2",

                Claims = new[]
                {
                    new Claim(Constants.ClaimTypes.GivenName, "Sven"),
                    new Claim(Constants.ClaimTypes.FamilyName, "Vercauteren"),
               }
            },
             
            new InMemoryUser
            {
                Username = "Nils",
                Password = "secret",
                Subject = "3",

                Claims = new[]
                {
                    new Claim(Constants.ClaimTypes.GivenName, "Nils"),
                    new Claim(Constants.ClaimTypes.FamilyName, "Missorten"),
               }
            },

            new InMemoryUser
            {
                Username = "Kenneth",
                Password = "secret",
                Subject = "4",

                Claims = new[]
                {
                    new Claim(Constants.ClaimTypes.GivenName, "Kenneth"),
                    new Claim(Constants.ClaimTypes.FamilyName, "Mills"),
               }
            }

           };
        }
    }


Lo tercero que vamos a hacer es agregar el scope, podemos pensar en el scope como la intencion del cliente, por ejemplo: Yo cliente pido que el usuario propietario, me conceda accesso a una api determinada o me retorne el nombre de un recurso.

    public static class Scopes
    {
        public static IEnumerable Get()
        {
            var scopes = new List
                {
                    StandardScopes.OpenId,
                    StandardScopes.Profile
                 };

            return scopes;
        }
    }


Al momento todas las configuraciones están relacionadas con la identidad. No tenes nada sobre el accesso a nuestra api.

 public class Startup
    {
        
        public void Configuration(IAppBuilder app)
        {
            app.UseWebApi(WebApiConfig.Register());
            app.Map("/identity", idsrvApp =>
            {
                idsrvApp.UseIdentityServer(new IdentityServerOptions
                {
                    SiteName = "Embedded IdentityServer",
                    IssuerUri = "https://communityapiidsrv3/embedded",
                    SigningCertificate = LoadCertificate(),

                    Factory = InMemoryFactory.Create(
                        users: Users.Get(),
                        clients: Clients.Get(),
                        scopes: Scopes.Get())
                });
            });
        }
        X509Certificate2 LoadCertificate()
        {
            return new X509Certificate2(
                $@"{AppDomain.CurrentDomain.BaseDirectory}\Certificate\idsrv3test.pfx", "idsrv3test");
        }
    }

 

Ahora vamos a dirijirnos a nuestra clase “Startup.cs”, clase de inicio de Owin:Bueno ya tenemos configurado nuestro servidor de tokens, para probarlo podemos correr nuestra aplicación y navegar a : https://localhost:44344//identity//.well-known/openid-configuration

En próximas publicaciones agregaremos capacidades a nuestro servidor e implementaremos un cliente.

Translate »