private async Task <UserToken> BuildToken(UserInfo userInfo, IList <string> roles, string Id, int inttipoUsuario)
        {
            var claims = new List <Claim>
            {
                new Claim(JwtRegisteredClaimNames.UniqueName, userInfo.UserName),
                new Claim("miValor", "Lo que yo quiera"),
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
            };


            foreach (var rol in roles)

            {
                claims.Add(new Claim(ClaimTypes.Role, rol));
            }

            var key   = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JWT:key"]));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

            // Tiempo de expiración del token. En nuestro caso lo hacemos de una hora.
            var expiration = DateTime.UtcNow.AddHours(12);

            JwtSecurityToken token = new JwtSecurityToken(
                issuer: null,
                audience: null,
                claims: claims,
                expires: expiration,
                signingCredentials: creds);
            string      strZona   = " ";
            Concesiones concesion = null;
            var         usuario   = await context.NetUsers.FirstOrDefaultAsync(x => x.Id == Id);

            var tipo = await context.tbtiposusuarios.FirstOrDefaultAsync(x => x.id == inttipoUsuario);

            if (tipo.strTipoUsuario == "AGENTE VIAL")
            {
                var zona = await context.tbzonas.FirstOrDefaultAsync(x => x.id == usuario.intidzona);

                strZona = zona.str_poligono;
            }
            var permisos = await context.tbpermisos.Where(x => x.id_rol == tipo.id).OrderBy(x => x.id).ToListAsync();

            if (tipo.strTipoUsuario != "MOVIL")
            {
                concesion = await context.tbconcesiones.FirstOrDefaultAsync(x => x.id == usuario.intidconcesion_id);
            }


            var ciudad = await context.tbciudades.FirstOrDefaultAsync(x => x.id == usuario.intidciudad);

            if (concesion == null && ciudad == null)
            {
                return(new UserToken()
                {
                    Token = new JwtSecurityTokenHandler().WriteToken(token),
                    Expiration = expiration,
                    Id = Id,
                    permisos = permisos,

                    strRuta = strZona,
                    strNombreUsuario = usuario.strNombre + " " + usuario.strApellidos
                });
            }
            else
            {
                return(new UserToken()
                {
                    Token = new JwtSecurityTokenHandler().WriteToken(token),
                    Expiration = expiration,
                    Id = Id,
                    permisos = permisos,
                    intIdCiudad = ciudad.id,
                    strCiudad = ciudad.str_ciudad,
                    strLatitud = ciudad.str_latitud,
                    strLongitud = ciudad.str_longitud,
                    intIdConcesion = concesion.id,
                    strConcesion = concesion.str_razon_social,
                    strRuta = strZona,
                    strNombreUsuario = usuario.strNombre + " " + usuario.strApellidos
                });
            }
        }
        public async Task <ActionResult <Concesiones> > mtdIngresarConcesiones([FromBody] ConcesionesConUsersIngresar concesiones)
        {
            ParametrosController    par = new ParametrosController(context);
            ActionResult <DateTime> horadeTransaccion = par.mtdObtenerFechaMexico();
            string strIdUsuario = "";
            string strResult    = "";

            //var strategy = context.Database.CreateExecutionStrategy();
            //await strategy.ExecuteAsync(async () =>
            //{
            using (IDbContextTransaction transaction = context.Database.BeginTransaction())
            {
                try
                {
                    var ciudad = await context.tbciudades.Where(x => x.str_ciudad == concesiones.str_ciudad).FirstOrDefaultAsync();

                    concesiones.dtm_fecha_ingreso = horadeTransaccion.Value;

                    var tipoUsuario = await context.tbtiposusuarios.FirstOrDefaultAsync(x => x.strTipoUsuario == "AGENTE VIAL");

                    var concesion = new Concesiones
                    {
                        str_clave                     = concesiones.str_clave,
                        str_latitud                   = concesiones.str_latitud,
                        str_longitud                  = concesiones.str_longitud,
                        str_razon_social              = concesiones.str_razon_social,
                        str_domicilio                 = concesiones.str_domicilio,
                        str_nombre_cliente            = concesiones.str_nombre_cliente,
                        str_telefono                  = concesiones.str_telefono,
                        str_email                     = concesiones.str_email,
                        str_rfc                       = concesiones.str_rfc,
                        str_notas                     = concesiones.str_notas,
                        int_licencias                 = concesiones.int_licencias,
                        dbl_costo_licencia            = concesiones.dbl_costo_licencia,
                        dtm_fecha_ingreso             = concesiones.dtm_fecha_ingreso,
                        dtm_fecha_activacion_licencia = concesiones.dtm_fecha_activacion_licencia,
                        str_tipo                      = concesiones.str_tipo,
                        intidciudad                   = ciudad.id,
                        str_ciudad                    = concesiones.str_ciudad,
                        intidciudad_cat               = concesiones.intidciudad_cat,
                        bit_status                    = true
                    };

                    context.tbconcesiones.Add(concesion);

                    await context.SaveChangesAsync();

                    ciudad.int_id_ciudad   = concesiones.intidciudad_cat;
                    ciudad.str_desc_ciudad = concesiones.str_ciudad;
                    await context.SaveChangesAsync();

                    foreach (var item in concesiones.cuentas)
                    {
                        var user = new ApplicationUser
                        {
                            UserName          = item.Email,
                            Email             = item.Email,
                            created_date      = horadeTransaccion.Value,
                            intidconcesion_id = concesion.id,
                            intIdTipoUsuario  = tipoUsuario.id,
                            intidciudad       = ciudad.id,
                            EmailConfirmed    = true,
                            bit_status        = true
                        };
                        strIdUsuario = user.Id;

                        var result = await _userManager.CreateAsync(user, item.PasswordHash);
                    }


                    var     result2 = concesiones.opciones;
                    dynamic results = JsonConvert.DeserializeObject(concesiones.opciones.ToString());


                    foreach (var token in results["int_id_opcion"])
                    {
                        context.tbpcionesconcesion.Add(new ConcesionesOpciones()
                        {
                            int_id_opcion    = token,
                            int_id_concesion = concesion.id
                        });

                        await context.SaveChangesAsync();
                    }

                    foreach (var item in concesiones.tarifas)
                    {
                        context.tbtarifas.Add(new Tarifas()
                        {
                            //str_tipo = item.str_tipo,
                            flt_tarifa_min        = item.flt_tarifa_min,
                            int_tiempo_minimo     = item.int_tiempo_minimo,
                            flt_tarifa_max        = item.flt_tarifa_max,
                            int_tiempo_maximo     = item.int_tiempo_maximo,
                            flt_tarifa_intervalo  = item.flt_tarifa_intervalo,
                            int_intervalo_minutos = item.int_intervalo_minutos,
                            bool_cobro_fraccion   = item.bool_cobro_fraccion,
                            intidconcesion_id     = concesion.id
                        });

                        await context.SaveChangesAsync();
                    }


                    transaction.Commit();
                }

                catch (Exception ex)
                {
                    transaction.Rollback();
                    strResult = ex.Message;
                }
            }
            //});

            return(Json(new { token = strResult }));
        }