Привет, хочу сделать API на ASP.net Core и хочу спросить пару вопросов по авторизации в API.
Api ещё не делается, я просто хочу спланировать и все нарисовать у себя в голове.
Представим, есть БД пользователей логин и пароль и мб ещё какой-то мусор.
Контроллер имеет метод Auth(string login, string pass) который вернет нам ответ в котором при успешном входе будет токен который мы и будем дальше использовать просто прикрепив к след запросам в Header.
Токен регистрируется в таблице Токенов с Id пользователя и IP получения. То-есть наш токен это ключ к совершению действий от пользователя, но только с того-же IP.
Есть контроллер с данными и прочими действиями, на них стоит атрибут авторизации который как раз и проверяет наличие этого токена в Header, если нет - не пропускает и возвращает ошибку, иначе все и работает по своему сценарию.
Вроде идея проста и я не вижу здесь "дыр" для взлома.
1) Мне кажется что в каждом запросе к API проверять валидность IP - Token (запрос к БД) будет долго и ответы будут больше пол секунды, как можно решить или так и делают?
2) Везде где читаю про эту тему пишут: "Не пишите сами, будет куча дыр! Используйте готовые решения. (Owin и тд)"
Есть ли в моей модели дыры?
3) Если я сделаю сайт (Веб приложение) который будет обращаться к API (я так понимаю как и обычный клиент - HTTP запросами), то по идее мой сайт будет одним из пользователей который использует Token и держит его в Header, будет ли виден он в веб-отладчике? с какого IP будут уходить запросы, сервера или пользователя? Я имею ввиду те корые будут не в контроллерах сайта, а Ajax.
Привязываться к IP-адресу - не самая лучшая идея, особенно если сайтом предполагается пользоваться с мобильных устройств, которые постоянно переключаются между мобильными и wifi-сетями.
1) Мне кажется что в каждом запросе к API проверять валидность IP - Token (запрос к БД) будет долго и ответы будут больше пол секунды, как можно решить или так и делают?
Кеш in-memory для активных токенов.
2) Везде где читаю про эту тему пишут: "Не пишите сами, будет куча дыр! Используйте готовые решения. (Owin и тд)"
Есть ли в моей модели дыры?
На стадии модели дыры рано искать, да и модель у вас поверхностная. Как будут генериться токены, какой сложности, вероятность коллизий - вот это вот все решает.
3) Если я сделаю сайт (Веб приложение) который будет обращаться к API (я так понимаю как и обычный клиент - HTTP запросами), то по идее мой сайт будет одним из пользователей который использует Token и держит его в Header, будет ли виден он в веб-отладчике? с какого IP будут уходить запросы, сервера или пользователя? Я имею ввиду те корые будут не в контроллерах сайта, а Ajax.
Смотря какой апи и как вы реализуете. Ajax - это клиентская технология, да, токен будет виден в отладчике.
На стадии модели дыры рано искать, да и модель у вас поверхностная. Как будут генериться токены, какой сложности, вероятность коллизий - вот это вот все решает.
Токен будет генерировать к примеру 40 рандомных символов, проверять наличие такого токена в БД, если есть - перегенерация.
Кеш in-memory для активных токенов.
Локальные данные наверное не сложно самому вбить, сможет ли он засунуть рабочий токен и любой IP в кеш и таким образом обойти фильтр проверки
Дмитрий Башинский, у токена есть время жизни. Есть же? Так же, есть (ли?) большая вероятность, что запросов от одного токена придет несколько в течении какого-то времени, скажем 5 минут. Почему бы не кешировать результат (или необходимые данные) проверки, тем самым разгрузив бд?
Почитал, интересная идея, но все таки мне кажется что моя секьюрнее, ибо если украсть те 2 токена, то хакер сможет юзать их пока юзер не перелогинится, а моя схема будет привязана к IP + можно сделать токен временным.
Короче говоря я попробую сделать 2 в одном и привяжу по IP и сделаю временные токены, в таком случае если хакер украдет token, то он не сможет его использовать с другого IP + он будет не валидным через время.
Если сайт будет являться просто вьюшкой API, то каждый кто авторизируется уже создаст свой токен, и сайт не будет использовать API как отдельный пользователь (я раньше думал что для сайт придется свою учетку сделать.)
Представим что у человека меняется IP при перезагрузке, тогда ему нужно будет постоянно входить? К чему можно ещё привязаться кроме IP?
Возможно глупые вопросы ибо я программировал только десктоп и только начинаю понимать принципы веба :)
Есть контроллер с данными и прочими действиями, на них стоит атрибут авторизации который как раз и проверяет наличие этого токена в Header, если нет - не пропускает и возвращает ошибку, иначе все и работает по своему сценарию.
А я прочитал это и прям понял что вы хотите переписать ASP.NET Identity. Все в точности как там. У методов контроллера можно поставить атрибут "Authorized", и тогда если пользователь не авторизован - то он будет переведён на страницу авторизации. Плюс к тому можно указать атрибут Роль, в котором можно указывать для каких ролей действует данный метод контроллера. Ну и много других преимуществ, таких как авторизация через социальные сети.
Все готово, просто не понимаю зачем вам тратить время на разработку своей собственной системы авторизации. Если только вы не пишете сайт для вооруженных сил...)