You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LogoutCommand.cs 2.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using BlackRock.Reporting.API.Authentication;
  2. using BlackRock.Reporting.API.Core.Models;
  3. using BlackRock.Reporting.API.Mediator.AuthenticationMediator.Models;
  4. using BlackRock.Reporting.API.Mediator.UserMediator.Model;
  5. using MediatR;
  6. using Microsoft.AspNetCore.Identity;
  7. namespace BlackRock.Reporting.API.Mediator.AuthenticationMediator.Commands
  8. {
  9. public class LogoutCommand : CredentialsCommand, IRequest<Result<bool>>
  10. {
  11. }
  12. public class LogoutCommandHandlers : IRequestHandler<LogoutCommand, Result<bool>>
  13. {
  14. private readonly ILogger<LogoutCommand> logger;
  15. private readonly IJwtManager jwtManager;
  16. private readonly IRefreshTokenManager refreshTokenManager;
  17. private readonly UserManager<ApplicationUser> userManager;
  18. public LogoutCommandHandlers(ILogger<LogoutCommand> logger, IJwtManager jwtManager, IRefreshTokenManager refreshTokenManager, UserManager<ApplicationUser> userManager)
  19. {
  20. this.logger = logger;
  21. this.jwtManager = jwtManager;
  22. this.refreshTokenManager = refreshTokenManager;
  23. this.userManager = userManager;
  24. }
  25. public async Task<Result<bool>> Handle(LogoutCommand command, CancellationToken cancellationToken)
  26. {
  27. if (command is null)
  28. throw new ArgumentException($"Parameter {nameof(command)} must not be null");
  29. try
  30. {
  31. // this checks is jwt token correct
  32. var userName = jwtManager.GetUserName(command.JwtToken);
  33. var user = await userManager.FindByNameAsync(userName);
  34. if (!(await refreshTokenManager.ValidateRefreshToken(user, command.RefreshToken)))
  35. return new Result<bool>
  36. {
  37. IsSuccess = false,
  38. Error = "Invalid token"
  39. };
  40. await refreshTokenManager.RemoveRefreshToken(user);
  41. return new Result<bool>
  42. {
  43. Data = true
  44. };
  45. }
  46. catch (Exception ex)
  47. {
  48. logger.LogError(ex, "Invalid token");
  49. return new Result<bool>
  50. {
  51. IsSuccess = false,
  52. Error = "Invalid token"
  53. };
  54. }
  55. }
  56. }
  57. }