using HmacDemoApi;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container
// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
builder.Services.AddOpenApi();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.MapOpenApi();
}

// Enable HMAC protection across your entire API pipeline
app.UseMiddleware();

app.MapPost("/api/data", (OrderRequest order, HttpContext context) =>
{
    var user = context.User.Identity?.Name; // "Client_App_01"
    return Results.Ok($"Product {order.ProductId} from {user}");
});

app.Run();

public record OrderRequest(int ProductId, int Quantity);

Implementar um cliente de autenticação HMAC no ASP.NET Core

O cliente de autenticação HMAC deve ser um projeto de aplicativo de console. Para nosso exemplo, simularemos um serviço de pedido simples. O cliente constrói a solicitação criando uma instância de pedido, serializando-a e assinando a mensagem usando a classe auxiliar compartilhada. Finalmente, o cliente invoca a API enviando os dados JSON e os cabeçalhos de autenticação necessários. Tudo isso é mostrado na listagem de códigos fornecida abaixo.

using HmacDemoSharedLibrary;

using System.Text;

using System.Text.Json;

Console.WriteLine("Press any key to invoke...");

Console.ReadLine();

await HmacClient.SendSecurePostRequestAsync();

Console.WriteLine("Press any key to stop...");

Console.ReadLine();

public class HmacClient

{

    private static readonly HttpClient client = new HttpClient();

    public static async Task SendSecurePostRequestAsync()

    {

        string url = "https://localhost:44399/api/data";

        string path = "/api/data";

        var order = new OrderRequest(101, 5);

        string jsonBody = JsonSerializer.Serialize(order);

        string timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString();

        string method = "POST";

        string payload = $"{method}n{path}n{timestamp}n{jsonBody}";

        string signature = HmacDemoHelper.ComputeHmacSha256(payload);

        var request = new HttpRequestMessage(HttpMethod.Post, url);

        request.Content = new StringContent(jsonBody, Encoding.UTF8, "application/json");

        request.Headers.Add("X-Api-Key", "Client_App_01");

        request.Headers.Add("X-Timestamp", timestamp);

        request.Headers.Add("X-Signature", signature);

        var response = await client.SendAsync(request);

        string result = await response.Content.ReadAsStringAsync();

        Console.WriteLine($"Status Code: {response.StatusCode}");

        Console.WriteLine($"Server Response: {result}");

    }

}

public record OrderRequest(int ProductId, int Quantity);

Autenticação HMAC em ação

Para executar esse aplicativo, primeiro defina os projetos de API Web (HmacDemoApi) e Aplicativo de Console (HmacDemoApiClient) como projetos iniciais no Visual Studio. Depois de definir a API Web e o Aplicativo de Console como projetos iniciais e executar o aplicativo no Visual Studio, você observará que o projeto de API Web iniciará uma página Web e o Aplicativo de Console iniciará uma janela de Comando.

A Figura 2 abaixo mostra como o aplicativo cliente captura a resposta do servidor e a exibe na janela Console.