• Как свести ответы сервисов к одной сущности asp net core web api?

    SunnyPh
    @SunnyPh
    Можете попробовать самостоятельно создать стандартный ответ из API.
    Например:
    public class APIResponse
        {
            public APIResponse()
            {
                ErrorMessages = new List<string>();
            }
            public HttpStatusCode StatusCode { get; set; }
            public bool IsSuccess { get; set; } = true;
            public List<string> ErrorMessages { get; set; }
            public object Result { get; set; }
        }


    И такой объект, будет содержать статус код, признак того обработан ли успешно запрос,
    список возможных ошибок и собственно сам результат ответа.

    Далее, ваш метод мог бы выглядеть так, с использованием этого стандартного ответа:

    public async Task<ActionResult<APIResponse>> GetProductById(int id)
            {
                try
                {
                    if (id == 0)
                    {
                        _response.StatusCode = HttpStatusCode.BadRequest;
                        return BadRequest(_response);
                    }
                   var product = await _productRepository.GetById(id);
                    if (product == null)
                    {
                        _response.StatusCode = HttpStatusCode.NotFound;
                        return NotFound(_response);
                    }
                    _response.Result = product;
                    _response.StatusCode = HttpStatusCode.OK;
                    return Ok(_response);
                }
                catch (Exception ex)
                {
                    _response.IsSuccess = false;
                    _response.ErrorMessages
                         = new List<string>() { ex.ToString() };
                }
                return _response;
            }


    Пример реализации такого подхода для WEB API в репозитории.
    Написано
  • Как лучше сделать быстрое уведомление менеджера о поступившем заказе в ИМ?

    SunnyPh
    @SunnyPh
    Если нужно получать уведомления о новых заказах немедленно в реальном времени, в открытом окне заказов, то это можно сделать если коммуникация между сервером и страницей заказов происходит через веб-сокеты, а не по HTTP запросам. Если, например, бэкенд вашего интернет магазина сделан на .NET, то можно использовать SignalR для этого.
    Написано
  • Смысл в JWT, если любой его может распарсить?

    SunnyPh
    @SunnyPh
    JWT токен генерируется для каждого успешно авторизованного пользователя, с помощью секретного ключа, так что если пользователь попытается получить данные с ресурса к которому у него уже закончился доступ, меняя просто дату, то такой токен не будет валидными и доступ к ресурсу для такого запроса будет запрещен. На примере .NET Identity в этом видео есть короткие объяснения как происходит генерация JWT токена. Это для C# и ASP.NET, но для других языков и фреймворков, все работает также.
    Написано
  • Где можно посмотреть реализацию готовых и профессиональных WebAPI в связке с клиентом?

    SunnyPh
    @SunnyPh
    Изучал тему WEB API в .NET 7, используя вот этот репозиторий.
    Здесь предствлен пример как самого WEB API, с реализацией CRUD на базе SQL базы данных, так и клиент ASP.NET MVC, также рассмотрена защита доступа к ресурсам как с помощью встроенной .NET Identity, так и независимого Duende Identity Server.
    Написано
  • Почему не проходит Authorize?

    SunnyPh
    @SunnyPh
    Посмотри вот этот плейлист. Здесь про авторизацию для приложений на ASP.NET MVC + Web API, версия .NET 7.

    Вот работающий код, для генерации токена, после успешной авторизации в API:
    public async Task<LoginResponseDTO> Login(LoginRequestDTO loginRequestDTO)
            {
                var user = _db.LocalUsers.FirstOrDefault(u => u.UserName.ToLower() == loginRequestDTO.UserName.ToLower()
                && u.Password == loginRequestDTO.Password);
    
                if (user == null)
                {
                    return null;
                }
    
                //if user was found generate JWT Token
    
                var tokenHandler = new JwtSecurityTokenHandler();
                var key = Encoding.ASCII.GetBytes(secretKey);
    
                var tokenDescriptor = new SecurityTokenDescriptor
                {
                    Subject = new ClaimsIdentity(new Claim[]
                    {
                        new Claim(ClaimTypes.Name, user.Id.ToString()),
                        new Claim(ClaimTypes.Role, user.Role)
                    }),
                    Expires = DateTime.UtcNow.AddDays(7),
                    SigningCredentials = new(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
                };
    
                var token = tokenHandler.CreateToken(tokenDescriptor);
                LoginResponseDTO loginResponseDTO = new LoginResponseDTO()
                {
                    Token = tokenHandler.WriteToken(token),
                    User = user
                };
                return loginResponseDTO;
            }


    Вот код контроллера идентификации на уровне WEB приложения ASP.NET MVC, с сохранением токена в текущей сессии.
    public class AuthController : Controller
        {
            private readonly IAuthService _authService;
            public AuthController(IAuthService authService)
            {
                _authService = authService;
            }
    
            [HttpGet]
            public IActionResult Login()
            {
                LoginRequestDTO obj = new();
                return View(obj);
            }
    
            [HttpPost]
            [ValidateAntiForgeryToken]
            public async Task<IActionResult> Login(LoginRequestDTO obj)
            {
                APIResponse response = await _authService.LoginAsync<APIResponse>(obj);
                if (response != null && response.IsSuccess)
                { 
                    LoginResponseDTO model = JsonConvert.DeserializeObject<LoginResponseDTO>(Convert.ToString(response.Result));
    
                    var handler = new JwtSecurityTokenHandler();
                    var jwt = handler.ReadJwtToken(model.Token);
    
                    var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
                    identity.AddClaim(new Claim(ClaimTypes.Name, jwt.Claims.FirstOrDefault(u => u.Type == "name").Value));
                    identity.AddClaim(new Claim(ClaimTypes.Role, jwt.Claims.FirstOrDefault(u=>u.Type=="role").Value));
                    var principal = new ClaimsPrincipal(identity);
                    await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
    
    
                    HttpContext.Session.SetString(SD.SessionToken, model.Token);
                    return RedirectToAction("Index","Home");
                }
                else
                {
                    ModelState.AddModelError("CustomError", response.ErrorMessages.FirstOrDefault());
                    return View(obj);
                }
            }
    
            [HttpGet]
            public IActionResult Register()
            {
                return View();
            }
    
    
            [HttpPost]
            [ValidateAntiForgeryToken]
            public async Task<IActionResult> Register(RegisterationRequestDTO obj)
            {
                APIResponse result =  await _authService.RegisterAsync<APIResponse>(obj);
                if (result != null && result.IsSuccess)
                {
                    return RedirectToAction("Login");
                }
                return View();
            }
    
    
            public async Task<IActionResult> Logout()
            {
                await HttpContext.SignOutAsync();
                HttpContext.Session.SetString(SD.SessionToken, "");
                return RedirectToAction("Index","Home");
            }
    
            public IActionResult AccessDenied()
            {
                return View();
            }
        }
    Написано
  • Какую LMS выбрать Фрилансеру и Руководителю для обучения сотрудников в 2023?

    SunnyPh
    @SunnyPh
    Мне тоже интересен этот вопрос, вот думаю самому написать LMS для себя. Бекенд точно на WEB API на .NET, а фронт еще не решил - React или может быть новомодный Blazor. Где то видел реализацию LMS с полным кодом React + Neыt.js, слышал что сейчас это модно, но у меня не хватает знаний для этого стека.
    Написано
  • Как добавить сервисы и использовать их в контроллерах?

    SunnyPh
    @SunnyPh
    pshevnin, вам уже ответили кратко но по сути, но если хотите разобраться получше, как добавить доступ к сервису Аутентификации, а также добавить его как компонент в конвейер для обработки запросов в WEB API, можете посмотреть вот в этом плейлисте
    Написано
  • Как добавить сервисы и использовать их в контроллерах?

    SunnyPh
    @SunnyPh
    В принципе, вы уже разобрались в чем различия версий .NET, но вот в этом видео, все подробно разжевано об этом.
    Написано
  • Почему в запросе нет тела?

    SunnyPh
    @SunnyPh
    OwDafuq, Извините, тогда я не понял вопроса. И если у вас в проекте с Blazor-Server, нет конвейера с Middlewares, тогда не знаю в чем проблема.
    Написано
  • Почему в запросе нет тела?

    SunnyPh
    @SunnyPh
    Покажите код из проекта на Blazor Server, там где вы формируете запросы к API, для получения или передачи данных из него. Вы пишите что у вас все Ок? с Blazor WASM, но при этом показываете код для двух проектов, с сервисом доступа к API в Middleware. Однако где формируются такие запросы не совсем понятно. В Blazor, для передачи данных также используются объекты-модели, которые нужно будет задавать в блоке @code{...} компонента. Затем нужно будет настроить получение данных, для экземпляра такого объекта из API. Я бы, сначала создал класс Репозиторий для этого, в котором настроен доступ к API, а потом уже внутри проекта Blazor-Server запрашивал такие данные из API. Вот в этом видео, показан пример такой настройки, только вместо обращения к API, используется обращение к классу репозитория, внутри проекта на Blazor-Server.
    Написано
  • Как вывести заработок с продаж в Microsoft Partner Center (Microsoft Store)?

    SunnyPh
    @SunnyPh
    Можно получить на карту иностранного банка, а далее через крипту перевести в РФ. Я так делал, только наоборот, то есть у меня есть карта иностранного банка на жену иностранку, а также есть именной, не обезличенный счет в официальном крипто обменнике, с банковской лицензией в стране, в Юго-Востончой Азии (где я сейчас и проживаю по ВНЖ). Так вот ситуация было обратная, в том смысле что мой бизнес партнер имел крипту, но сам находился в Евросоюзе, и что бы уменьшить налоги с продажи крипты, он переводил крипту мне, а я ему переводил банковским переводом на его европейский банк в евро, якобы за выполненные работы, то есть как его доход от бизнеса.....Как то так....Иначе вариков нет...
    Написано
  • Blazor Server, как получить тело запроса?

    SunnyPh
    @SunnyPh
    OwDafuq, Не знаю, поможет вам это или нет, но содержимое передаваемое через Hub, можно посмотреть в браузере, в NetWork, в закладке с вебсокетами WS, где можно увидет название вашего Hub, и сообщение если оно передается в json а не в messagepack 64eda39b13a12776998668.jpeg
    Написано
  • Blazor Server, как получить тело запроса?

    SunnyPh
    @SunnyPh
    В Вlazor-Server данные со страницы клиента, с помощью Java-Script, передаются на специальный Hub, на сервере, в Miidвleware для этого, есть endpoint по умолчанию MapBlazorHub, где происходит обработка данных. Вот в этом видео коротко про Hub в SignalrR. Однако в приложениях Blazor-Server, используется также и стандартная маршрутизация через MapRazorPages. И если у вас установлена .NET Identity, то страница Login передает данные на сервер через обработчик OnPost, находящийся в модели страницы Login. Если я кончено правильно понял в чем был вопрос.
    Написано
  • Сервер аутентификации ldap+openid+ad?

    SunnyPh
    @SunnyPh
    https://duendesoftware.com/products/identityserver Но он платный, если ваша компания зарабатывает более ляма баксов в год.
    Написано
  • Как обойти несостыковку в имени и платёжных данных на Upwork?

    SunnyPh
    @SunnyPh
    64e55b16d4454746363874.jpeg

    Озаботился этой проблемой прочитав ваш вопрос. UpWork реально еще не юзал, но решил проверить могу ли я привязать систему оплаты в UpWork.

    Исходные данные:
    - Аккаунт на UpWork на мое имя, с локацией Филиппины.
    - Карта Visa оформленная на жену - филиппинку, фамилии совпадают.
    - PayPal на мое имя с верификацией по местной симке и с email,
    к PayPal для вывода привязана та же карта Visa жены.

    Результаты эксперимента:
    1. Попытка привязать аккаунт PayPal оказалась неудачной,
    так требуется прохождение какой то дополнительной верификации на PayPal,
    не очень понял какой.
    2. Попытка привязать напрямую карту Visa, с указанием пин кода, была удачной,
    если верить сообщению по результатам привязки.

    Но возможно это еще не конец истории, и позже возникнут дополнительные требования.
    Написано
  • На чем делать интернет магазин на 15-25 товаров?

    SunnyPh
    @SunnyPh
    Sanes, вот печальный пример реализации CMS OpenCart. Идею сделать интернет- магазин за "дешево" и "сердито", собственнику продали быстро....Через год после того как было поставлено куча "чудесных" модулей результаты в PageSpeed Insights для домена https://metrica-markt.ru/ 64de0b5e516fc092619809.jpeg
    Написано
  • Как адаптировать MapPost в метод ControllerBase?

    SunnyPh
    @SunnyPh
    Возможно вы некорректно передаете данные для POST запрос из клиента. Если вы хотите использовать АSP.NET MVC или Razor Pages то посмотрите вот это видео. Если у вас только бэкенд на ASP. NET то посмотрите вот здесь. Как я понимаю в комментарии вы попытались использовать Minimal API, про обработку запросов в Minimal Apiэто, посмотрите вот здесь.
    Написано
  • Как пользователю сохранить созданный файл?

    SunnyPh
    @SunnyPh
    Не совсем понятно, как вы создав файл File(fs1, file_type, file_name), куда и как вы его возвращаете. В MVC все данные из контроллера, и точнее из какого то action метода контроллера передаются в рамках протокола HTTP, через метод типа Get, и тип возвращаемого результата должен быть наследником интерфейса IActionResult, читайте об ASP.NET Core MVC на Метанит. По поводу типа возвращаемых результатов на запросы IActionResult, есть кое что в этом видео.
    Написано