Program.
cs
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Cors.Infrastructure;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
var key = Encoding.UTF8.GetBytes("SuperSecretKey123!");
// Configurar CORS
builder.Services.AddCors(options =>
{
optio...
AuthController.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
[ApiController]
[Route("api/auth")]
public class AuthController : ControllerBase
{
[HttpPost("login")]
public IActionResult Login([FromBody] LoginRequest request)
{
if (request.Username == "admin" && request.Password == "adminpass")
{
var token = GenerateJwtToken("admin");
retur...
ProductsController.cs
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
[ApiController]
[Route("api/products")]
public class ProductsController : ControllerBase
{
private readonly AppDbContext _context;
public ProductsController(AppDbContext context)
{
_context = context;
}
[HttpGet]
[Authorize(Policy = "UserOrAdmin")]
public async Task<ActionResult<PaginatedResult>> GetProducts([FromQuery] int page = 1, [FromQuery] int pageSi...
Product.cs
public class Product(int Id, string Name, decimal Price)
{
public int Id { get; set; } = Id;
public string Name { get; set; } = Name;
public decimal Price { get; set; } = Price;
}
LoginRequest.cs
public class LoginRequest
{
public string Username { get; set; } = string.Empty;
public string Password { get; set; } = string.Empty;
}
AppDbContext.cs
using Microsoft.EntityFrameworkCore;
public class AppDbContext(DbContextOptions<AppDbContext> options) : DbContext(options)
{
public DbSet<Product> Products => Set<Product>();
}
AuthService.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Router } from '@angular/router';
@Injectable({ providedIn: 'root' })
export class AuthService {
private tokenKey = 'authToken';
private roleKey = 'userRole';
constructor(private http: HttpClient, private router: Router) {}
login(username: string, password: string) {
return this.http.post<{ token: string; role: string }>('https://localhost:5001/api/auth/login', { username, password })
...
AuthGuard.ts
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';
import { AuthService } from '../services/auth.service';
@Injectable({ providedIn: 'root' })
export class AuthGuard implements CanActivate {
constructor(private authService: AuthService, private router: Router) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
if (this.authService.isAuthenticated()) {
return tru...
HttpInterceptor.ts
import { Injectable } from '@angular/core';
import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpErrorResponse } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { AuthService } from '../services/auth.service';
import { Router } from '@angular/router';
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor(private authService: AuthService, private router: Router) {}
intercept(req: ...
LoginComponent.ts
import { Component } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms';
import { AuthService } from '../services/auth.service';
import { CommonModule } from '@angular/common';
@Component({
selector: 'app-login',
standalone: true,
imports: [CommonModule],
templateUrl: './login.component.html',
styleUrls: ['./login.component.css']
})
export class LoginComponent {
loginForm: FormGroup;
constructor(private fb: FormBuilder, private authService: AuthService) {
t...
LoginComponent.html
<div class="container d-flex justify-content-center align-items-center vh-100">
<div class="card p-4 w-50 shadow">
<h2 class="text-center mb-4">Iniciar Sesión</h2>
<form [formGroup]="loginForm" (ngSubmit)="login()">
<div class="mb-3">
<label for="username" class="form-label">Usuario</label>
<input id="username" formControlName="username" class="form-control" placeholder="Usuario" required>
</div>
<div class="mb-3">
<label for="password" class="form-label">Con...
LoginComponent.css
body {
background-color: #f8f9fa;
}
.container {
height: 100vh;
}
.card {
max-width: 400px;
width: 100%;
border-radius: 10px;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
}
.btn-primary {
background-color: #007bff;
border: none;
}
.btn-primary:hover {
background-color: #0056b3;
}