Persiltech.UserServices
0.1.4
dotnet add package Persiltech.UserServices --version 0.1.4
NuGet\Install-Package Persiltech.UserServices -Version 0.1.4
<PackageReference Include="Persiltech.UserServices" Version="0.1.4" />
<PackageVersion Include="Persiltech.UserServices" Version="0.1.4" />
<PackageReference Include="Persiltech.UserServices" />
paket add Persiltech.UserServices --version 0.1.4
#r "nuget: Persiltech.UserServices, 0.1.4"
#:package Persiltech.UserServices@0.1.4
#addin nuget:?package=Persiltech.UserServices&version=0.1.4
#tool nuget:?package=Persiltech.UserServices&version=0.1.4
Persiltech.UserServices
Implementación para ASP.NET Core de IUserService (el Output Port de
Persiltech.UserServices.Abstractions),
que resuelve la identidad y el estado de autenticación del usuario actual a partir de
HttpContext.User.
Instalación
dotnet add package Persiltech.UserServices
El contrato
public sealed class HttpContextUserService(IHttpContextAccessor httpContextAccessor) : IUserService
{
public bool IsAuthenticated { get; }
public string? UserName { get; }
public string? FullName { get; }
}
public static class DependencyInjection
{
public static IServiceCollection AddHttpContextUserService(this IServiceCollection services);
}
El constructor lanza ArgumentNullException si el accesor es null.
Las propiedades se evalúan en cada lectura y nunca se cachean: la misma instancia puede
atender peticiones distintas, y es el IHttpContextAccessor quien resuelve el contexto de
la petición en curso.
IsAuthenticated es true solo si hay HttpContext activo y su User.Identity está
autenticada. Cuando es false, tanto UserName como FullName son null: no se leen
reclamaciones de un usuario no autenticado. Por eso ambas propiedades son anulables —
el caso anónimo es legítimo, no un error.
Resolución de las reclamaciones
UserName toma la primera con valor no vacío, en este orden:
User.Identity.Name, es decir, la reclamación que la propia identidad declare como nombre (ClaimTypes.Namesalvo que se haya remapeado, como suele ocurrir con JWT)preferred_username(OpenID Connect)ClaimTypes.Upn
FullName toma la primera opción que produzca un valor no vacío, en este orden:
- La reclamación
name(OpenID Connect) - La unión de
ClaimTypes.GivenNameyClaimTypes.Surname, separadas por un espacio, omitiendo la que falte
Un valor formado solo por espacios en blanco cuenta como ausente y se descarta.
Uso
using Persiltech.UserServices;
using Persiltech.UserServices.Abstractions;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpContextUserService();
var app = builder.Build();
app.MapGet("/whoami", (IUserService userService) => new
{
userService.IsAuthenticated,
userService.UserName,
userService.FullName
});
app.Run();
AddHttpContextUserService registra IHttpContextAccessor y IUserService →
HttpContextUserService con tiempo de vida Singleton, y devuelve la misma colección para
encadenar. El registro es idempotente: llamarlo dos veces no duplica los servicios, y si la
aplicación ya tenía una implementación de IUserService registrada, la conserva.
El paquete no establece ni valida la autenticación: solo lee la identidad que el canal de
ASP.NET Core ya haya establecido, así que la aplicación consumidora sigue siendo la
responsable de su UseAuthentication() y su esquema.
Decisiones de diseño
- El contrato
IUserServiceno se redefine aquí: llega del paquetePersiltech.UserServices.Abstractionspublicado en nuget.org, referenciado por NuGet. - La dependencia de ASP.NET Core se declara con
<FrameworkReference Include="Microsoft.AspNetCore.App" />, no con un<PackageReference>aMicrosoft.AspNetCore.Http.Abstractions. Ese paquete es la vía de ASP.NET Core 2.x sobrenetstandard2.0: en una libreríanet10.0duplicaría tipos que ya trae el framework compartido. La referencia al framework también aportaMicrosoft.Extensions.DependencyInjection.Abstractions, así que el paquete no declara ninguna dependencia NuGet más allá de las abstracciones. - El adaptador es
sealedy sin estado: toda la información sale deHttpContexten el momento de la lectura. - Registro
Singleton: es el tiempo de vida que corresponde a una identidad ligada a la petición, y evita que un consumidor conserve por accidente valores de una petición en otra. - Sin opciones de configuración para los nombres de las reclamaciones. El orden de resolución es fijo en esta versión.
Fuera de alcance
- Adaptadores para escenarios sin
HttpContext(consola, workers, servicios en segundo plano). - Autenticación y autorización.
- Reclamaciones distintas de las tres propiedades del contrato (roles, permisos, identificadores de inquilino): ampliar el contrato es trabajo del paquete de abstracciones.
Compatibilidad
net10.0, con el framework compartido Microsoft.AspNetCore.App.
Estado
Versión 0.x: la superficie pública puede cambiar entre versiones menores.
Historial de versiones
| Versión | Cambios |
|---|---|
| 0.1.4 | La dependencia mínima de Persiltech.UserServices.Abstractions baja de 0.1.8 a 0.1.0, la primera que ya expone el contrato implementado: instalar este paquete deja de forzar una actualización que nadie necesitaba. El README estrena este historial y retira su apartado de licencia, que nuget.org ya publica en la pestaña License. |
| 0.1.3 | La insignia de licencia del README enlaza al texto real y relleno de la licencia, en lugar de a la plantilla SPDX, que muestra el año y el titular sin sustituir. |
| 0.1.2 | La página del paquete pasa a ser la del portafolio. El .nuspec deja de declarar el repositorio y se apaga SourceLink, porque el código fuente no es público. |
| 0.1.1 | La licencia MIT viaja como archivo dentro del .nupkg en lugar de declararse solo como expresión SPDX, así que nuget.org muestra su texto completo. |
| 0.1.0 | Primera publicación. |
La superficie pública no ha cambiado desde 0.1.0: todo lo publicado hasta ahora corrige
empaquetado y documentación, nunca el contrato. Actualizar es siempre seguro.
Soporte
El código fuente de este paquete no es público. Para dudas, informes de error o peticiones de mejora, usa la página del paquete.
Apoya el desarrollo
Si el paquete te ahorra trabajo, puedes apoyar su mantenimiento en GitHub Sponsors.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Persiltech.UserServices.Abstractions (>= 0.1.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.