Persiltech.UserServices
0.1.2
See the version list below for details.
dotnet add package Persiltech.UserServices --version 0.1.2
NuGet\Install-Package Persiltech.UserServices -Version 0.1.2
<PackageReference Include="Persiltech.UserServices" Version="0.1.2" />
<PackageVersion Include="Persiltech.UserServices" Version="0.1.2" />
<PackageReference Include="Persiltech.UserServices" />
paket add Persiltech.UserServices --version 0.1.2
#r "nuget: Persiltech.UserServices, 0.1.2"
#:package Persiltech.UserServices@0.1.2
#addin nuget:?package=Persiltech.UserServices&version=0.1.2
#tool nuget:?package=Persiltech.UserServices&version=0.1.2
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.
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.
Licencia
MIT. El texto completo viaja dentro del paquete, en el archivo LICENSE, y nuget.org lo
muestra en la pestaña License de la
página del paquete.
| 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.8)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.