This is my first WIP backend asp.net application, which I will pair with react to create a full stack app. The thing I'm mostly worried about is model conversion to DTO and custom policy authorization, as It has 2 contexts I feel like it's bloated, and hacked. I will be grateful for any tips, from experienced developers, as I have no real commercial experience, and I am self-taught.
Custom authorization:
public class FamilyHeadOnlyHandler : AuthorizationHandler<FamilyHeadOnlyRequirement> {
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly FamilyManDbContext _databaseContext;
private readonly UserManager<ApplicationUser> _userManager;
public FamilyHeadOnlyHandler(
IHttpContextAccessor httpContextAccessor,
FamilyManDbContext databaseContext,
UserManager<ApplicationUser> userManager
) {
_httpContextAccessor = httpContextAccessor;
_databaseContext = databaseContext;
_userManager = userManager;
}
protected override async Task HandleRequirementAsync(
AuthorizationHandlerContext context, FamilyHeadOnlyRequirement requirement) {
var currentUserId = context.User.FindFirst(c => c.Type == ClaimTypes.NameIdentifier)?.Value;
var requestedFamilyId = _httpContextAccessor.HttpContext!.GetRouteValue("id")!.ToString();
var requestedFamily = await _databaseContext.Families!.Include("Head").FirstOrDefaultAsync(f => f.Id.ToString() == requestedFamilyId);
if (requestedFamily == null) {
throw new NotFoundException("Family not found.");
}
if (requestedFamily!.Head!.Id == currentUserId) {
context.Succeed(requirement);
}
}
}
I'm aware, that most people use Allman indentation convention, but I'm used to C, C++ and JavaScript's K&R standard. And I might need to start Allman in my C# code.
Link to the repo, which contains full code: Github repo
Edit: AuthorizationHandlerContext
context is default context of overriden method, it has currentUser
property, but lacks things such as route value, ability to manipulate cookies, and so on, unlike HttpContextAccessor
. Now the second thing is, userManager
is part of IdentityContext
, which is in my databaseContext
. I probably could use _dataBaseContext
instead of _userManager
to manipulate user, but the _userManager
is built in, whereas databaseContext
is my own context. It feels like bloated code to me. I would like to know, if this is good by design, or should I change it. Is the code readable?