IdentityServer4 - логин и регистрация пользователя
Вставка
- Опубліковано 3 гру 2024
- Разработка ASP NET Core Web API с нуля профессионально. Видео 12. IdentityServer4 - логин и регистрация
Если хотите поддержать канал: pay.cloudtips....
Мы продолжаем работать с IdentityServer4 и сегодня доработаем наш сервер авторизации для нашего Web API и клиентов, которые будут этот Web API использовать. Мы добавим возможность регистрироваться и входить в систему.
Мы в Telegram: t.me/platinum_...
Чат для общения и вопросов: t.me/platinum_...
Код из видео: github.com/and...
Technology vector created by vectorjuice: www.freepik.co...
Возможно, что в следующих уроках уже поправили, но на всякий случай: в AuthController в get-методе Register должно быть return View(viewModel) вместо View(returnUrl).
спасибо большое за наблюдательность! да, к сожалению, пришлось исправить этот момент отдельно уже после записи.. в репозитории с кодом отдельным коммитом: github.com/andreisfedotov/Notes/commit/fbd18ed60d95e04956ec81313a06002913e2a6ce
Очень объемное и познавательное видео. Странно что просмотров так мало.
Один важный момент для тех кто будет делать подобный сервис. Делать 2 отдельных ошибки "User not found" и "Login error" -- плохая практика. Так злоумышленник может подобрать сначала Логин, а после пытаться к логину подобрать пароль (есть разные способы). Поэтому ошибка должна быть всегда одна: Login Error. Не давайте подсказки злоумышленникам :)
В любом случае злоумышленник может просто начать регаться под разными логинами и подобрать логин который уже занят) Что в этом случае делать?
Дуже дякую.
Остался вопрос, я региструруюсь и вижу юзера в бд Auth, но вот как Notes.Backend поймет, что такой юзер есть и пустит к данным? или это вследующих сериях?)
Спасибо
Большое спасибо за уроки, они очень информативны и полезны!
В данном видео рассматривается разграничение доступа к "своим" объектам. Есть ли у вас идеи / подходы / шаблоны для системы, в которой пользователи могут давать доступ к своим файлам для других пользователей (на чтение / изменение) ?
Вообщем сгорем пополам, прикрутил я IdentityServer к бекенду через клиент, только вот как получить Guid ведь чтобы юзать наше приложение Identity должен получить свой Guid. сейчас я делаю через простые Credenteals и Jwt токен, подскажите как получить наш Guid
А почему аттрибут
[Authorize] вы ставите для каждого метода, а не на контроллере? Для этого какая то причина есть?
Нет, можно по-другому
А как сделать редирект с api на identity server, если пользователь не авторизован?
автоматически должно
Для этого служит тэг [Authorize] в методах контроллера и добавление конфигурации в Startup классе. На основе этого Web API и IdentityServer будут понимать авторизован пользователь или нет. У клиента, которым пользуется пользователь также есть конфигурация, в которой указываются адреса перенаправления, в том числе и тот, куда надо идти для того чтобы авторизоваться. Про конфигурацию клиента будет рассказано в ближайших видео
в целом это не задача апи , ведь апи может вызывать и десктоп.клиент , по этому апи лишь возвращает код ошибки доступа . а уже клиент - будь то веб.браузер или десктоп app , решает что с этим делать.
Подскажите как можно это все запомнить? Объем инфы просто огромный.)
Постепенно, не за один раз) практикуясь)
А еще не старайтесь запомнить все конструкции с настройками и остальные детали. Запоминайте принципы и логику работы. Детали вы всегда сможете найти в справочниках. Главное правильно запомнить что ты делаешь и зачем, а не как.
Такой вопрос, делаю веб апи приложение интернет магазин по вашему шаблону, мне надо хранить информацию о клиентах в отдельной таблице, которая связана с таблицей заказов отношением один ко многим, но если логика аутентификации вынесена в отдельное решение и база данных юзеров там своя, собственно как и и в вашем видео, можно ли как-то связать две бд из разных решений, чтобы иметь доступ к информации о клиентах, то бишь юзерах из бд решения аутентификации, в самом веб апи магазина, или придется дублировать таблицу заказчиков в решении веб апи для этой цели?
Мне сказали, что логичнее всего в таком случае будет дублировать таблицу заказчиков в бд самого магазина и хранить там айди юзеров из бд решения аутентификации, так ли это? Или может всё-таки есть какая-то возможность интегрировать две бд из разных решений? Или вообще может лучше в таком случае не разделять аутентификацию и само приложение магазина на разные решения, а делать всё в одном? Что вы можете сказать по этому поводу?
Появилось ещё предложение вынести контекст в отдельный проект и расшарить его между двумя решениями
Задача IdentityServer хранить информацию о пользователях и их ролях, всё то, что относится к аутентификации и авторизации. знать что-либо о бизнес логике ему не нужно, то есть о товарах или для чего бы он не использовался. веб апи может у себя хранить ту информацию о пользователях которая ему необходима. общими у обоих решений будут идентификаторы пользователей, остальное разное - у айдентити это роли, у веб апи например информация о товарах. в веб апи проекте инфо о пользователе можно брать из токена при оформлении товара и тд.
@@PlatinumTechTalks Понял, спасибо вам большое за развернутый ответ!
А почему ViewModel , я вместо этого пишу DTO
Спасибо за видео. Но я так и не понял как зарегистрироваться и залогиниться. Я думал, что после перехода по адресу /api/note/ должно перекинуть на страницу логина IS. Но этого не произошло.
Автоматически переадресация не происходит. С тегом [Authorize] эндпоинт /api/note будет ждать токен доступа, иначе вернет 401.
Переадресация настраивается отдельно в конфигурации
@@PlatinumTechTalksты же сказал, что на это видео с аутентфикацией всё. Но не показал как она работает! Гениально! Хотя чего ждать. Валидацию сделали, а как работает снова не показал. Молодец, хули!
Всем привет. Вопрос, при Login или Register в ReturnUrl всегда null. Проверяю и Get запросы и Post . В базу запись упала, спустя несколько попыток, но тот же Login не срабатывает, так как ModelState Invalid, потому что ReturnUrl - Required, но содержит null. В чем может быть причина?
Благодарю за ответ
убрать Required
github.com/andreisfedotov/Notes/blob/main/Notes.Identity/Notes.Identity/Models/LoginViewModel.cs
Как я понял, это происходит из-за того, что в новых версиях .Net появились nullable-типы и в нашем LoginViewModel поле ReturnUrl не помечено как nullable-тип. Похоже, что это автоматически учитывается и даже если поле не помечено атрибутом Required (то есть по сути не является обязательным), то в любом случае значение null для этого поля будет восприниматься как ошибка. Я решил эту проблему, сделав поле ReturnUrl nullable-типом (пометил как string?). Либо же можно отключить nullable-типы в свойствах проекта.
Не знаю, что сделал не так, но когда перехожу по /api/note? выдаёт ошибку {"error":"No authenticationScheme was specified, and there was no DefaultChallengeScheme found. The default schemes can be set using either AddAuthentication(string defaultScheme) or AddAuthentication(Action\u003CAuthenticationOptions\u003E configureOptions)."}
@egorkaras8947 У меня такая же ошибка, если вы вдруг разобрались, можете описать как в двух словах
У меня почему-то после _signInManager.SignOutAsync() не происходит разлогин пользователя и logoutRequest.PostLogoutRedirectUri всегда равен null. В чем тут может быть проблема?
Решил проблему. Оказалось, что Microsoft.AspNetCore.ApiAuthorization.IdentityServer конфликтует с их собственным System.Text.Json (-_-)
рады, что получилось решить проблему! извините за поздний ответ =)
А как сделать если авторизация через реакт?
Авторизация через реакт - это что вы имеете в виду? Авторизует делать что-то сервер, а не клиент, чем являются реакт приложения.
О том как через реакт приложение пройти аутентификацию через IdentityServer будет показано в ближайших видео
@@PlatinumTechTalks , имею в ввиду когда страница авторизации(логин,пароль) реализована на реакте
вероятно, для этого стоит посмотреть авторитетные в этой теме источники... но что касается IdentityServer'а то его идея заключается в том, чтобы хранить всё что относится к авторизации у себя, включая страницы входа
@@PlatinumTechTalks имеется ввиду урлы для точек авторизации/аутентификации ?
@@МихаилИванов-м2э это больше относится к самим страницам входа/регистрации
Подскажете, пожалуйста, при указании адреса localhost:44319/Auth/Login компонент Login.cshtml вызывает ошибку:Model.ReturnUrl равен null, из-за чего может быть данная ситуация?
Присоединяюсь. Та же проблема.
так это потому что некуда возвращаться, поэтому return url и null. если бы был совершен переход с какой-либо страницы, а не введен вручную в адресную строку, то и return url не был бы пустым
@@PlatinumTechTalks это простите меня, очевидно как угол дома. а подскажите пожалуйста, как это использовать? допустим я понял как строить RediterUrl localhost:44350/Auth/Register?ReturnUrl=localhost:44300%2Fapi%2Fnote где %2F является "/" но, как мне проверить функционал который у нас работает и как мне использовать ваш пример сервера запущенного с двух проектов?
Есть проблема - в файле _ViewImports.cshtml и Login.cshtml (дальше 5:00 не шел) @model и @addTagHelper горит красным аля ошибка (the name 'addTagHelper' does not exists in current context), но проект запускается. Есть у кого идеи в чем проблема?
балииин, я думал проект на web api, а вы тут mvc херачите(
Я просто фигею с того что уже неактуальную инфу продолжают постить, так и не нашел грамотной реализации регистрации на duende с помощью SPA