Class UserService
- Namespace
- adas_core.Authentication
- Assembly
- adas-core.Authentication.dll
Provides the concrete implementation of user-related service operations defined by the IUserService contract.
public class UserService : IUserService
- Inheritance
-
UserService
- Implements
- Inherited Members
- Extension Methods
Remarks
This class is the default service component responsible for handling user domain logic and delegating persistence or infrastructure concerns as required by the interface.
Constructors
UserService(IEnumerable<ILoginService>, IOptions<AuthSettings>, IOptions<ValidGroupsConfig>, IOptions<AuthSettings>, IOptions<AuthSettings>, IHttpContextAccessor, IUserRepository, IAuthorityService, ILocalAuditService, Lazy<IDisplayService>, ILogger<UserService>, ISubscribersService, IClientMessageService, Lazy<IPermissionService>)
public UserService(IEnumerable<ILoginService> loginServices, IOptions<AuthSettings> configuration, IOptions<ValidGroupsConfig> validGroups, IOptions<AuthSettings> usersWhiteList, IOptions<AuthSettings> jwt, IHttpContextAccessor httpContextAccessor, IUserRepository userRepository, IAuthorityService authorityService, ILocalAuditService auditService, Lazy<IDisplayService> displayService, ILogger<UserService> logger, ISubscribersService subscribersService, IClientMessageService clientMessageService, Lazy<IPermissionService> permissionService)
Parameters
loginServicesIEnumerable<ILoginService>configurationIOptions<AuthSettings>validGroupsIOptions<ValidGroupsConfig>usersWhiteListIOptions<AuthSettings>jwtIOptions<AuthSettings>httpContextAccessorIHttpContextAccessoruserRepositoryIUserRepositoryauthorityServiceIAuthorityServiceauditServiceILocalAuditServicedisplayServiceLazy<IDisplayService>loggerILogger<UserService>subscribersServiceISubscribersServiceclientMessageServiceIClientMessageServicepermissionServiceLazy<IPermissionService>
Methods
ClaimsFromAuthorities(List<Authorization>)
Asynchronously resolves a list of Claim objects from the provided Authorization entries.
When an authorization has a UnitId, the associated display is looked up and its identifier is assigned to the authorization before the claim is added; otherwise, the claim is added directly.
public Task<List<Claim>> ClaimsFromAuthorities(List<Authorization> authorities)
Parameters
authoritiesList<Authorization>The list of authorizations to convert into claims.
Returns
- Task<List<Claim>>
A task that represents the asynchronous operation, containing the list of claims built from the supplied authorities.
CreateNewAuthority(Authorization)
Creates a new user authority based on the provided authorization. If the underlying authority service returns a null result, indicating that the creation failed, a conflict exception is raised.
public Task<Authorization> CreateNewAuthority(Authorization auth)
Parameters
authAuthorizationThe authorization used to create the new user authority.
Returns
- Task<Authorization>
The newly created Authorization instance.
Exceptions
- ConflictException
Thrown when the authority service fails to create the user authority (returns null).
CreateNewUserByRequest(User)
Creates a new user after validating email and username uniqueness; for local accounts, it enforces password strength and hashes the password before persistence.
public Task<User?> CreateNewUserByRequest(User user)
Parameters
userUserThe user to create, including email, username, password, and account type.
Returns
Exceptions
- UnprocessableEntityException
Thrown when a local user's password is not considered strong.
- NotFoundException
Thrown when the user cannot be retrieved by username after insertion.
CreateNewUserWithAuthorities(CreateUserWithAuthDto)
Creates a new user along with the specified authorizations, associating each authorization with the newly created user. Throws an exception if the user cannot be created.
public Task<User?> CreateNewUserWithAuthorities(CreateUserWithAuthDto createUserWithAuthDto)
Parameters
createUserWithAuthDtoCreateUserWithAuthDtoThe data transfer object containing the user details and the list of authorizations to associate with the new user.
Returns
- Task<User>
The newly created user, or
nullif creation fails (in which case an exception is thrown instead).
Exceptions
- NotFoundException
Thrown when the user cannot be created by the underlying request, indicating a missing resource.
CreateUser(User)
Creates a new user from LDAP data after validating that the username and email are not already in use, persists the entry, and records the creation in the audit log.
public Task<User?> CreateUser(User userEntryLdap)
Parameters
userEntryLdapUserThe user information sourced from LDAP to be created in the system.
Returns
- Task<User>
The created user retrieved by username, or null if the user cannot be found after insertion.
DeleteAuthority(string)
Deletes a user authority identified by the specified string identifier. Validates the identifier format and throws if the deletion cannot be completed.
public Task<bool> DeleteAuthority(string id)
Parameters
idstringThe string representation of the authority's ObjectId to delete.
Returns
Exceptions
- BadRequestException
Thrown when the provided
idis not a valid ObjectId format.- ConflictException
Thrown when the underlying delete operation fails.
DeleteUser(ObjectId)
Deletes a user by its identifier, records an audit log entry for the deletion, and returns the operation result.
Returns false if an error occurs during deletion, in which case the exception is logged.
public Task<bool> DeleteUser(ObjectId id)
Parameters
idObjectIdThe identifier of the user to delete.
Returns
- Task<bool>
A task that resolves to
truewhen the user is successfully deleted; otherwise,falseif an error is encountered.
GenerateJwt(User)
Generates a JSON Web Token (JWT) pair (access and refresh) for the specified user, including claims derived from the user's authorization data when available.
public Task<TokenResult> GenerateJwt(User user)
Parameters
userUserThe user whose identity, email, IP address, and authorization claims will be embedded in the generated tokens.
Returns
- Task<TokenResult>
A TokenResult containing the serialized access and refresh tokens, their respective expiration times, and the associated user.
GetAll()
Retrieves the list of all users by attempting each valid login method in order, selecting the first service that supports password authentication. If a service throws a BusinessException it is remembered and the next service is tried; other exceptions are logged and wrapped in a LoginServicesException. Throws the captured exception from the last attempt, or LoginServicesNotFoundException when no suitable login service is found.
public Task<List<User>> GetAll()
Returns
- Task<List<User>>
A task that resolves to the list of User objects returned by the first successful login service.
Exceptions
- LoginServicesException
Thrown when a non-business exception occurs while retrieving users from a service.
- LoginServicesNotFoundException
Thrown when no login service matches the valid login methods or all attempts fail without a captured business exception.
GetPaginatedUsers(PaginationFilter)
Retrieves a paginated list of users based on the provided filter, including the total document count for pagination metadata.
public Task<PaginationResponse<User>> GetPaginatedUsers(PaginationFilter filter)
Parameters
filterPaginationFilterThe pagination filter containing the page number and page size used to skip, limit, and shape the result set.
Returns
- Task<PaginationResponse<User>>
A task that represents the asynchronous operation. The task result contains a PaginationResponse<T> with the requested page of users and pagination details.
GetUser(string, string)
Authenticates a user by iterating through the configured valid login methods, attempting each available password-enabled service until one succeeds. If every login attempt fails, a LoginServicesNotFoundException is thrown.
public Task<User> GetUser(string username, string password)
Parameters
Returns
Exceptions
- LoginServicesNotFoundException
Thrown when no configured login service successfully authenticates the user.
GetUserByCasTicket(string, string)
Authenticates a user using a CAS (Central Authentication Service) ticket and returns the associated user if authorization succeeds.
public Task<User?> GetUserByCasTicket(string serviceUrl, string ticket)
Parameters
serviceUrlstringThe URL of the service requesting CAS authentication.
ticketstringThe CAS ticket issued by the CAS server to validate.
Returns
- Task<User>
The authenticated User if the ticket is valid and the user passes whitelist and group checks; otherwise, an exception is thrown.
Exceptions
- LoginServicesException
Thrown when the CAS login method is not available, or when an unexpected error occurs during authentication.
- UnauthorizedAccessException
Thrown when the authenticated user is not in the users whitelist and does not belong to any valid group.
- BusinessException
Rethrown when a business-level error occurs during the login process.
GetUserById(ObjectId)
Retrieves a user by their unique identifier, including the user's assigned authorities when the user is found.
Returns null if the user does not exist or if an error occurs while loading the user or its authorities.
public Task<User?> GetUserById(ObjectId id)
Parameters
idObjectIdThe unique identifier of the user to retrieve.
Returns
- Task<User>
A Task<TResult> containing the user with its authorization populated, or
nullif the user cannot be found or an exception is thrown during retrieval.
GetUserByName(string)
Retrieves a user by their name, including the user's authorization information if the user is found.
Returns null if the user does not exist or if an error occurs while retrieving the data.
public Task<User?> GetUserByName(string name)
Parameters
namestringThe name of the user to look up.
Returns
GetUserByToken(JwtSecurityToken?)
Retrieves the user associated with the provided JWT security token.
Returns null if the token is null or if no matching user is found.
public Task<User?> GetUserByToken(JwtSecurityToken? jwtToken)
Parameters
jwtTokenJwtSecurityTokenThe JWT security token used to identify the user. May be
null.
Returns
- Task<User>
A task that resolves to the User associated with the token, or
nullif the token is invalid or no user matches.
GetUserByUserName(string)
Retrieves a user by their username, including their assigned authorities. Returns null if no user with the specified name exists.
public Task<User?> GetUserByUserName(string name)
Parameters
namestringThe username to look up.
Returns
- Task<User>
The matching User with its
Authorizationproperty populated from the authority service, ornullif no user is found.
Login(string, string)
Authenticates a user with the provided credentials and generates a JWT token upon successful authentication. Performs validations for user existence, account status (enabled and not locked), and authorization via whitelist or group membership. Updates the user's last login timestamp and clears the lock expiration if it has expired before issuing the token.
public Task<TokenResult> Login(string username, string password)
Parameters
usernamestringThe username used to look up the user account.
passwordstringThe password used to verify the user's credentials.
Returns
- Task<TokenResult>
A Task<TResult> containing the generated TokenResult for the authenticated user.
Exceptions
- UnauthorizedException
Thrown when no user matches the provided credentials, or when the user is not in the whitelist or valid groups.
- ForbbidenException
Thrown when the user account is disabled or currently locked.
LoginWithAccessToken(string)
Authenticates a user using a previously issued access token and issues a new JWT. Validates the provided token, retrieves the associated user, and loads user authorities on demand before generating the authentication response.
public Task<TokenResult> LoginWithAccessToken(string token)
Parameters
tokenstringThe access token used to identify and authenticate the user.
Returns
- Task<TokenResult>
A Task<TResult> containing the generated JWT for the authenticated user.
Exceptions
- NotFoundException
Thrown when no user is found that matches the validated access token.
LoginWithGivenAccessToken(string)
Authenticates a user using a provided access token and returns a new token pair. Validates the token, retrieves the associated user, and either generates a fresh JWT if the original is expired, or issues new access and refresh tokens preserving the remaining lifetime of the supplied token.
public Task<TokenResult> LoginWithGivenAccessToken(string token)
Parameters
tokenstringThe access token to validate and use for user authentication.
Returns
- Task<TokenResult>
A TokenResult containing the new access token, refresh token, their expiry times, and the authenticated user.
Exceptions
- NotFoundException
Thrown when no user can be resolved from the provided token.
RefreshToken(string)
Refreshes a JWT token using the provided refresh token. Validates the refresh token, retrieves the associated user, and generates a new JWT; if the user is not found, returns an empty TokenResult.
public Task<TokenResult> RefreshToken(string refreshToken)
Parameters
refreshTokenstringThe refresh token used to generate a new JWT.
Returns
- Task<TokenResult>
A TokenResult containing the new JWT, or an empty result if the user associated with the token is not found.
UpdateAuthority(Authorization)
Updates the authority for the specified authorization entry. If the underlying authority service returns a null result, a conflict is raised to signal that the update could not be applied.
public Task<bool> UpdateAuthority(Authorization authorization)
Parameters
authorizationAuthorizationThe authorization details used to update the user's authority.
Returns
Exceptions
- ConflictException
Thrown when the authority service returns a null response, indicating the update failed.
UpdateUserPassword(ObjectId, string, string)
Updates the password of an existing user after validating the current password and the strength of the new one, logging the change and recording an audit entry on success.
public Task<bool> UpdateUserPassword(ObjectId id, string oldPassword, string newPassword)
Parameters
idObjectIdThe unique identifier of the user whose password will be updated.
oldPasswordstringThe user's current password, used to verify the request before applying the change.
newPasswordstringThe new password to set; must differ from the current password and meet the strength policy.
Returns
- Task<bool>
A task that resolves to
truewhen the password is successfully updated, orfalseif the repository update returns no result.
Exceptions
- BadRequestException
Thrown when
newPasswordis equal tooldPassword.- NotFoundException
Thrown when no user exists for the supplied
id.- UnprocessableEntityException
Thrown when
oldPassworddoes not match the user's current password, or whennewPassworddoes not satisfy the strength policy.
UpdateUserWithAuthorities(UpdateUserWithAuthDto, bool)
Updates an existing user together with the associated authorities (roles/permissions), validating that the email and user name remain unique. Deletes, updates, and creates authorities according to the provided DTO, and broadcasts the new permission set whenever at least one authority change has been applied.
public Task<User?> UpdateUserWithAuthorities(UpdateUserWithAuthDto updateUserWithAuthDto, bool updatePass)
Parameters
updateUserWithAuthDtoUpdateUserWithAuthDtoDTO containing the user to update along with the lists of authorities to delete, update, and add.
updatePassboolFlag indicating whether the user's password should be updated as part of the operation.
Returns
Exceptions
- ConflictException
Thrown when the underlying user update returns no result.
UpdateUsersByRequest(User, bool)
Updates a user, optionally updating their password, and broadcasts relevant notifications when the password changes, the user is disabled, or the account becomes locked.
public Task<User?> UpdateUsersByRequest(User user, bool updatePass)
Parameters
userUserThe user with the updated information to be persisted.
updatePassboolIndicates whether the user's password should be updated and re-hashed.
Returns
- Task<User>
The updated user returned by the repository, or
nullif the user could not be found or updated.
Exceptions
- UnprocessableEntityException
Thrown when
updatePassistrueand the provided password does not meet the strong password policy.
ValidateToken(string, string, out SecurityToken)
Validates a JWT token using the configured audience, issuer, and symmetric signing key, and returns the validated security token. The token must be a JWT signed with the HmacSha256 algorithm; otherwise, validation fails and a TokenException is thrown.
public void ValidateToken(string token, string tokenType, out SecurityToken validatedToken)
Parameters
tokenstringThe JWT token string to validate.
tokenTypestringThe type of the token being validated.
validatedTokenSecurityTokenWhen the method returns, contains the validated SecurityToken if validation succeeds.
Exceptions
- TokenException
Thrown when the token is invalid, is not signed with the HmacSha256 algorithm, or any other validation error occurs.