using DomainObjects; using DataProviders.Collections; using DomainObjects.Documents; using ExtensionMethods; using Extensions; using Microsoft.AspNetCore.Authorization; using WeatherForecast.Services; namespace WeatherForecast.Policies.Abstractions; /// /// /// /// public abstract class AuthorizationHandlerBase : AuthorizationHandler where TRequirement : IAuthorizationRequirement { private readonly IHttpContextAccessor _contextAccessor; private readonly IUserDataProvider _userDataProvider; private readonly IAccountPolicyService _accountService; /// /// /// /// /// /// public AuthorizationHandlerBase( IHttpContextAccessor contextAccessor, IUserDataProvider userDataProvider, IAccountPolicyService accountService ) { _contextAccessor = contextAccessor; _userDataProvider = userDataProvider; _accountService = accountService; } /// /// /// /// /// protected UserDocument? GetUser(AuthorizationHandlerContext context) { if (context == null) return null; var userId = context.User?.Identity?.Name?.ToNullableGuid(); var bearerToken = _contextAccessor.HttpContext?.Request?.GeBearerToken(); if (userId == null || bearerToken == null) return null; var (user, getUserResult) = _userDataProvider.Get(userId.Value); if (!getUserResult.IsSuccess || user == null) return null; if (!_accountService.Authenticate(user, bearerToken).IsSuccess) return null; return user; } } /// /// /// /// /// public abstract class AuthorizationHandlerBase : AuthorizationHandler where TRequirement : IAuthorizationRequirement { private readonly IHttpContextAccessor _contextAccessor; private readonly IUserDataProvider _userDataProvider; private readonly IAccountPolicyService _accountService; /// /// /// /// /// /// public AuthorizationHandlerBase( IHttpContextAccessor contextAccessor, IUserDataProvider userDataProvider, IAccountPolicyService accountService ) { _contextAccessor = contextAccessor; _userDataProvider = userDataProvider; _accountService = accountService; } /// /// /// /// /// protected UserDocument? GetUser(AuthorizationHandlerContext context) { if (context == null) return null; var userId = context.User?.Identity?.Name?.ToNullableGuid(); var bearerToken = _contextAccessor.HttpContext?.Request?.GeBearerToken(); if (userId == null || bearerToken == null) return null; var (user, getUserResult) = _userDataProvider.Get(userId.Value); if (!getUserResult.IsSuccess || user == null) return null; if (!_accountService.Authenticate(user, bearerToken).IsSuccess) return null; return user; } }