/// <inheritdoc /> public Task <TResult> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate <TResult> next) { if (request is IBotActionRequest botRequest) { if (_contextAccessor.Context.IsAuthorized) { return(next()); } var handlerType = _handlerFinder.FindHandlerTypeByRequest(typeof(TRequest)); if (handlerType != null) { var isAnonymous = handlerType.GetCustomAttribute <AllowAnonymousAttribute>(inherit: false) != null; if (isAnonymous) { _contextAccessor.Context.IsAnonymous = true; return(next()); } } var options = _optionsProvider.Value; var sender = botRequest.Update.Message?.From; if (sender != null) { var isTrusted = options.Authorization.TrustedUsers.AdministratorIds.Contains(sender.Id); if (!isTrusted) { return(Task.FromException <TResult>( new UnauthorizedAccessException($"User '{sender}' is not trusted, command declined."))); } _contextAccessor.Context.IsAuthorized = true; _logger.LogInformation($"Action from user '{sender}' authorized successfully"); } } return(next()); }