Progra IV
Progra IV
Cambiar en SQL server click derecho en el servidor, propiedades, security, cambiar a SQL server
and Windows authentication mode , luego en el server/ security/logins ,verificar que este sa
(superusuario), si no está habilitado le damos click derecho/ propiedades /status/ enable, luego en
general darle una contraseña (en este caso la contraseña es Uh2024) y quitamos el check enforce
password policy.
Creamos clase en Models(en esta ocasión la llamamos Product) y agregamos los variables
Despues
Creamos ORM ,en la raíz del programa click derecho//administrar paquetes NuGet.
Esto para poder interactuar con la base de datos, los paquetes deben verse como la figura de
arriba.
"ConnectionStrings": {
"StringConexion": "Server=DESKTOP-EA10T5P\\SQLEXPRESS;DataBase=DbProductos;user
id=sa;Password=Uh2024;TrustServerCertificate=True"
Colocamos:
//Configuración del contexto se indicar el string de conexión que almacena la información del
servidor base datos,se configura el ORM para que trabaje con la clase DbContextProducts además
se indica el string de conexión que apunta al servidor SQL.
builder.Services.AddDbContext<API_Products.Data.DbContextProducts>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("StringConexion")));
Tambien le indicamos que herede de la librería DbContext que se encarga de interactuar con el
server de base de datos
Luego: update-database.
using Microsoft.AspNetCore.Mvc;
namespace API_Products.Controllers
{
public class ProductsController : Controller
{
lista = Context.Producto.ToList();
return lista;
}
[HttpPut("Registrar")]
public async Task<string> Registrar(Productos pProduct)
{
string mensaje = "";
try
{
Context.Producto.Add(pProduct);
await Context.SaveChangesAsync();
mensaje = "Producto registrado correctamente...";
}
catch (Exception ex)
{
//retorna el mensaje
return Mensaje;
[HttpPost("Editar")]
if (aux != null)
{
aux.Descripcion = temp.Descripcion;
aux.PrecioCompra=temp.PrecioCompra;
aux.Impuesto=temp.Impuesto;
Context.Producto.Update(aux);
await Context.SaveChangesAsync();
return $"Producto {aux.Descripcion} modificado correctamente...";
}
else
{
return $"Producto {temp.ID} no existe ...";
}
}
}
SUBIR BBDD A LA NUBE
Ahora vamos a sincronizar la API y la BBDD a la nube , creamos dos cuentas Microsoft ,una para la
base de datos y otra para la api, lo registramos en somee, y escogemos el free hosting
Una vez que ingresamos . en el menú izquierdo en My SQL/database /create batabase , llenamos
el registro seleccionamos la versión 2022 de SQL , Nos vamos a managment y hacemos backup de
nuestra base de datos, luego en somee en la parte de base de datos nos dirigimos a restore/upload
and restore y buscamos el backup file , en run script se pueden hacer pruebas para verificar la
funcionabilidad de la BBDD y en database details salen los datos requeridos como nombre de
servidpr en la nube usuario y password para conectar la base de datos nada mas cuando vamos a
conectar en managment studio darle la opción SQL server authentication , también hay que
cambiar los datos de la cadena de conexión en la API
Cuenta : [email protected]
Contraseña:oscarFLOR09852.$
Contraseña:oscarFLOR09852.$
Creamos al proyecto una carpeta llamada Data y dentro de la carpeta creamos una clase para
invocar a la API web creada anteriormente . y creamos el código :
client.BaseAddress = new Uri("https://localhost:7174"); //esta es la url del API web creado antes
return client;
if (respuesta.IsSuccessStatusCode)
{
//Se lee los datos en formato JSON
var resultado =
respuesta.Content.ReadAsStringAsync().Result;
//se convierte los datos en una lista de productos
listado =
JsonConvert.DeserializeObject<List<Product>>(resultado);
}
//se envia la lista de productos al front.end
return View(listado);
}
}//cierre controller
} //cierre namespaces
En esta parte del código que escribimos arriba :
public async Task<IActionResult> Index()
en el index le damos clic derecho/agregar vista /vista de razor.
Plantilla :list
Marcamos usar pagina de diseño, buscamos en los tres puntos , views/shared/layout y agregamos
y de ahí nos enviara al index
<li class="nav-item">
</li>
Aho hay que agregar código a la API programada anteriormente para que el programa pueda
guardar datos , al inicio del controlador de la API agregamos las siguientes dos etiquetas:
//estas dos etiquetas se utilizan para poder indicar que nuestro
controlador implementa protocolo HHTP rest
[ApiController]
//nombre de controlador
[Route("[controller]")]
[HttpPost]
[ValidateAntiForgeryToken]//no permite tantos llamados al metodo para
evita spam
public async Task<IActionResult> Create([Bind] Product product)
{
var agregar =
clientHttp.PutAsJsonAsync<Product>("/Products/Registrar", product);
//se espera que finalice
await agregar;
//se almacena el resultado de la API
var resultado = agregar.Result;
//Se valida si la transaccion fue exitosa
if (resultado.IsSuccessStatusCode)
{
//se ubica el usuario dentro del listado productos
return RedirectToAction("Index");
}
else
{
//se almacena el error
TempData["ERROR"] = "ERROR,no se logro almacenar el producto";
return View(product);
}
}//cierre método
Etiqueta eliminar
[HttpGet]
public async Task<IActionResult> Delete(int ID) // crear la vista razor
{ //variable temporal para almacenar datos del producto
Product temp = new Product();
//se utiliza el metodo de la API para buscar el producto
HttpResponseMessage buscar = await
clientHttp.GetAsync($"/Products/Consultar?id={ID}");
}
//se retorna la view con los datos del producto
return View(temp);
}
[HttpPost]
public async Task<IActionResult> Delete(int? ID)
{
HttpResponseMessage delete = await
clientHttp.DeleteAsync($"/Products/Eliminar?id={ID}");
if (delete.IsSuccessStatusCode)
{
return RedirectToAction("Index");
}
else
{
return View(ID);
}
Etiqueta Modificar
[HttpGet]
public async Task<IActionResult> Edit(int id) // crear la vista razor
{ //variable temporal para almacenar datos del producto
Product temp = new Product();
//se utiliza el metodo de la API para buscar el producto
HttpResponseMessage buscar = await
clientHttp.GetAsync($"/Products/Consultar?id={ID}");
}
//se retorna la view con los datos del producto
return View(temp);
Y modificamos en el index :
[HttpPost]
public async Task<IActionResult> Edit([Bind] Product temp)
{
HttpResponseMessage mensaje = await
clientHttp.PostAsJsonAsync<Product>("/Products/Editar", temp);
if (mensaje.IsSuccessStatusCode)
{
return RedirectToAction("Index");
}
else
{
return View(temp);
}
Etiqueta Details
public async Task<IActionResult> Details(int Id) // crear la vista
razor
{
Product temp = new Product();
HttpResponseMessage buscar = await
clientHttp.GetAsync($"/Products/Buscar?id={Id}");
if (buscar.IsSuccessStatusCode)
{
var resultado = buscar.Content.ReadAsStringAsync().Result;
temp = JsonConvert.DeserializeObject<Product>(resultado);
}
return View(temp);
}
agregamos una carpeta llamada Services al proyecto y ahí mismo agregamos una interfaz llamada
IAutorizacionServices.
En la interfaz colocamos
/// <summary>
/// metodo encargado de devolvcer el token al usuario autorizado
/// </summary>
/// <param name="autorizacion"></param>
/// <returns></returns>
Task< AutorizacionrResponse > DevolverToken(Usuario autorizacion);
using API_Productos1.Model;
//Librerias para implementar JWT
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
//para utilizar ORM
using Microsoft.EntityFrameworkCore;
using API_Productos1.Data;
ahora en la carpeta Data creamos otro DbSet para Usuarios y queda asi:
public DbSet <Usuario> Usuarios { get; set; }
using API_Productos1.Model;
//Librerias para implementar JWT
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
//para utilizar ORM
using Microsoft.EntityFrameworkCore;
using API_Productos1.Data;
using API_Productos1.Model.Custom;
namespace API_Productos1.Services
{
public class AutorizacionServices : IAutorizacionServices
{
//variable para usar la referencia del ORM
private readonly DbContextProducts _context;
//variable para utilizar el archivo de configuracion JSON
private readonly IConfiguration _configuration;
/// <summary>
/// constructor con parametros recibe la configuracion y
dbcontext
/// </summary>
/// <param name="configuration"></param>
/// <param name="context"></param>
public AutorizacionServices(IConfiguration
configuration ,DbContextProducts context)
{
this._configuration = configuration;
this._context = context;
}
if (temp == null)
{
//en caso de null regresa autorizacion en blanco
return await Task.FromResult<AutorizacionResponse>(null);
}
string tokenGenerado =
GenerarToken(autorizacion.Email.ToString());
return new AutorizacionResponse() { Token = tokenGenerado,
Resultado = true , Msj = "OK" };
return tokenCreado;
}
}
"key": "Frase_Jwt_palabra_key=*ProductsWebSeguridadUH"
}
Creamos una carpeta en Model llamada Custom y dentro de esta creamos una clase
llamada AutorizacionResponse y ahí agregamos el código :
builder.Services.AddScoped<IAutorizacionServices, AutorizacionServices>();
builder.Services.AddAuthentication(config =>
{
config.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
config.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
});
builder.Services.AddAuthentication(config =>
{
config.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
config.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(config =>
{
config.RequireHttpsMetadata = false;
config.SaveToken = true;
config.TokenValidationParameters = new
Microsoft.IdentityModel.Tokens.TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(keyBytes),
ValidateIssuer = false,
ValidateAudience = false,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero,
};
});
using API_Productos1.Services;
using API_Productos1.Data;
using Microsoft.AspNetCore.Mvc;
using API_Productos1.Services;
using API_Productos1.Data;
using Microsoft.EntityFrameworkCore;
namespace API_Productos1.Controllers
{
public class UsuariosController : Controller
{
//variable para manejar la referencia del ORM
private readonly DbContextProducts _context;
//variable para manejar el servicio de autorizacion
private readonly IAutorizacionServices _autorizacionServices;
if (temp == null)
{
if (autorizado==null)
{
return Unauthorized();
}
else
{
return Ok(autorizado);//SE DEVUELVE EL TOKEN
}
}
}
}
}