A cohesive set of infrastructure libraries for dotnet that utilizes abstractions for event handling, persistence, unit of work, mediator, distributed messaging, event bus, CQRS, email, and more
$ dotnet add package RCommon.WebASP.NET Core integration for the RCommon security abstractions. Provides HttpContextCurrentPrincipalAccessor which resolves the current ClaimsPrincipal from HttpContext.User instead of Thread.CurrentPrincipal, making ICurrentUser, ICurrentClient, ITenantIdAccessor, and all claims-based security abstractions work correctly in web applications.
HttpContextCurrentPrincipalAccessor reads the authenticated user from IHttpContextAccessor.HttpContext.UserWithClaimsAndPrincipalAccessorForWeb() registers all security services wired to the HTTP contextWithClaimsAndPrincipalAccessor() in ASP.NET Core applicationsdotnet add package RCommon.Web
The default ThreadCurrentPrincipalAccessor (from RCommon.Security) reads from Thread.CurrentPrincipal, which is null in ASP.NET Core. This means ICurrentUser, ClaimsTenantIdAccessor, and all claims-based services silently return null in web apps.
HttpContextCurrentPrincipalAccessor bridges this gap by reading from HttpContext.User.
Replace WithClaimsAndPrincipalAccessor() with WithClaimsAndPrincipalAccessorForWeb() in your ASP.NET Core application:
using RCommon;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRCommon(config =>
{
// Use this instead of config.WithClaimsAndPrincipalAccessor()
config.WithClaimsAndPrincipalAccessorForWeb();
});
This registers:
HttpContextCurrentPrincipalAccessor as ICurrentPrincipalAccessorIHttpContextAccessor (via AddHttpContextAccessor())ICurrentUser, ICurrentClient, ITenantIdAccessor (same as the non-web variant)Once registered, inject ICurrentUser, ICurrentClient, or ITenantIdAccessor in your controllers or services:
using RCommon.Security.Users;
using RCommon.Security.Claims;
public class OrderController : ControllerBase
{
private readonly ICurrentUser _currentUser;
private readonly ITenantIdAccessor _tenantIdAccessor;
public OrderController(ICurrentUser currentUser, ITenantIdAccessor tenantIdAccessor)
{
_currentUser = currentUser;
_tenantIdAccessor = tenantIdAccessor;
}
[HttpGet]
public IActionResult GetUserInfo()
{
return Ok(new
{
UserId = _currentUser.UserId,
TenantId = _tenantIdAccessor.GetTenantId(),
Roles = _currentUser.Roles,
IsAuthenticated = _currentUser.IsAuthenticated
});
}
}| Type | Description |
|---|---|
HttpContextCurrentPrincipalAccessor | ICurrentPrincipalAccessor implementation that reads from HttpContext.User |
WebConfigurationExtensions | Provides WithClaimsAndPrincipalAccessorForWeb() extension method for DI registration |
For full documentation, visit rcommon.com.
ICurrentUser, ICurrentPrincipalAccessor, ITenantIdAccessor)Licensed under the Apache License, Version 2.0.