|
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,759
|
|
Server-side Blazor, аутентификация/авторизация25.06.2019, 23:04. Показов 11853. Ответов 13
Метки нет (Все метки)
Задайте, пожалуйста, хотя бы общие направления (может подробные мануалы есть?). По туториалам и по стандартным шаблонам Студии да, можно сделать, чтобы работало. Можно то же самое прочитать в документации и сделать по шагам. Но совершенно не понятно, как оно внутри устроено.
Для самостоятельного фронтэнд-приложения, код которого выполняется в браузере, всё понятно. Приложение тем или иным образом (через прямое обращение к методу API, через редирект на страницу IS4, и т.п.) по логину/паролю получает токен доступа (и, возможно, рефреш-токен), сохраняет его где-то у себя в памяти (или в куках, если требуется) и далее, при обращении к методам API включает токен в HTTP-заголовок. На стороне сервера, где живёт API, токен проверяется согласно каким-то правилам и далее даётся/запрещается доступ к указанному API-методу. А как оно происходит в случае с server-side? И какие варианты реализации вообще есть? И общая архитектура и логика в этом случае какая? 1. В браузере только вспомогательный JS, который создаётся и поддерживается без участия программиста и который прозрачно для разработчика взаимодействует с логикой фронтэнда на сервере через SignalR. 2. На сервере, где фронтэнд-логика находится, для каждого подключенного пользователя автоматически создаётся своя сессия (и поддерживается соединение), в рамках которой и нужно хранить полученные токены? Т.е. пользователь запросил страницу, сервер проверил в его сессии наличие валидного токена, если нет, то редиректнул на страницу аутентификации (в самом простом случае на свою же, или модальное окно показал), там пользователь ввёл логин/пароль, нажал "вход", на сервере (в сессии данного клиента) по кнопке "вход" отработал код проверки логина пароля по базе (или, скажем, через прямое обращение к IS4 по Resource Owner Password Flow), был получен токен, который сохранился в сессию пользователя. Далее этот токен используется для обращений к API, для получения от API набора прав пользователя, для кастомизации интерфейса в зависимости от уровня доступа, который вернул API. При этом API может быть как какой-нибудь внешний, с доступом по HTTP, так и виде зависимой сборки, сервисы которой доступны через DI.
0
|
|
| 25.06.2019, 23:04 | |
|
Ответы с готовыми решениями:
13
Blazor server-side: тестирование Авторизация через ASP.NET и аутентификация на SQL Server применив SqlCredential Error while trying to run project: Unable to start debugging on the web server. Server-side error occurred on sending debug HTTP request. |
|
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,929
|
|
| 26.06.2019, 12:35 | |
|
kotelok, насколько я понял, авторизацию прикрутили в Preview6. Добавили некие компоненты-обёртки, которые пробрасывают информацию о пользователе, где и можно узнать авторизован пользователь, али нет. Авторизация, судя по всему (предположение), происходит перед установкой соединения по SignalR (или соединение переустанавливается после авторизации классическим образом) и токен (или что там) первым делом отсылается на сервер и просто держится в ОЗУ.
Вопрос интересный, я бы тоже его поисследовал как время появится. Официально доступная информация по этой теме в release notes
1
|
|
|
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
|
|
| 26.06.2019, 13:28 | |
|
https://github.com/aspnet/AspN... s/src/Auth
- аутентификация в блазор. - на сколько я понял , нужно писать наследника для AuthenticationStateProvider.cs и реализовать свою логику авторизации. В приложениях Blazor на стороне сервера реализация AuthenticationStateProvider может брать данные пользователя из Http контекста (которые сами же и передаем в запросе), В клиентских приложениях Blazor (те , что выполняются в контексте WebAssembly) реализация AuthenticationStateProvider может обращаться к какому либо апи сервису или хранить данные в хранилищах браузера - свобода реализации в общем. В плане визуализации , они сделали вью.компоненту , которая анализирует результат работы нашей реализации AuthenticationStateProvider и решает какой контент показывать или нет (привет веб.формы LoginView)
1
|
|
|
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,759
|
|
| 26.06.2019, 19:41 [ТС] | |
|
Как-то очень тяжеловесно получается на предлагаемых MS решениях.
Если делать на базе 'ASP.NET Core Identity' (дефолтный шаблон из preview-6), то он по умолчанию привязывается к EF-контексту и требует базу специфичной структуры для хранения пользователей. А у меня древняя легаси-база со своими таблицами безопасности и лепить рядом ещё одну, и как-то поддерживать синхронизацию пользователей с ней совершенно не хочется. Если от EF отказаться, но оставить тот же сценарий с Identity, то приходится реализовывать громоздкую кучку интерфейсов (хранилище пользователей, хранилище ролей, класс уравления пользователями и т.п.). Вероятно, можно отказаться от 'Identity' и реализовать свой кастомный мидлвар (со своей страничкой) для аутентификации с последующей инициализацией 'User.Identity' в текущем HTTP-контексте из которого потом данные будут извлекаться для отрисовки верхней плашки и для реализации 'AuthenticationStateProvider' (через который будут корректно работать встроенные механизмы авторизации компонентов Blazor). Но тут я пока совершенно не понимаю, как это правильно и безопасно реализовывать. Дефолтная реализация по кнопке логина редиректится на отдельную статик-страницу (отдельным HTTP-запросом), после успешного логина устанавливает/обновляет две какие-то куки (одна для AspIdentity, вторая для antiforgery), после чего редиректит обратно на приложение, которое заново подключается к серверу уже с правильными куками, после чего устанавливает коннект SignalR и больше HTTP-запросов не шлёт. Но по кнопке 'Logout' кука 'Identity' почему-то не обновляется и не удаляется, только модифицируется кука antiforgery. Так же не понятно, как заставить браузерную сторону при установлении соединения отправлять какую-то кастомную куку на сервер.
0
|
|
|
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
|
|
| 26.06.2019, 20:06 | |
|
1. Выбираешь ASP.Core Host. Получаешь 2 проекта: клиент и сервер
2. Прикручиваешь туда jwt Вот сейчас пытаюсь сие забабахать, ибо то что работало в Core 2.2 напрочь отказывается в 3.0 И кстати, Identity к авторизации вообще-то никаким боком, если есть своя база с пользователями - используй ее.
1
|
|
|
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,759
|
|||
| 26.06.2019, 20:12 [ТС] | |||
|
0
|
|||
|
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,759
|
|
| 27.06.2019, 08:44 [ТС] | |
|
Ещё вопрос общего характера - как самому себе обосновать выбор в пользу server/client-side Blazor? Проект - небольшая внутренняя система учёта на пару сотен пользователей (и локальные, и через инет). Требование пользовательского уровня - отзывчивый интерфейс (без рефрешей всего при каждом клике), вероятно, встроенный чатик, плюс различные уведомления пользователей о событиях сервера.
Раньше выбор был очевиден - приложение в браузере и API на сервере. Но теперь server-side-версия, с точки зрения поведения UI, вообще ничем не отличается от client-side. Более того, при тестах в рамках одной машины (т.е. без влияния пинга) у меня вообще получается, что server-side работает более отзывчиво, и это заметно даже просто на глаз. Т.е. одно и то же базовое приложение из стандартного шаблона: 1. При начальной загрузке: client-side - несколько секунд, server-side - мгновенно. 2. При переходе на страницу, где запрашиваются данные для отображения в таблице: client-side - видна пауза перед отображением (при каждом переходе), server-side - мгновенно. Здесь, очевидно, сказываются накладные расходы client-side, которому надо - установить коннект на API-сервер, сформировать/отправить HTTP-запрос, на сервере разобрать HTTP-запрос, сериализовать данные в JSON, на клиенте десериализовать полученные данные и подготовить для отображения. А для server-side всё проще - соединение (SignalR) уже установлено и поддерживается, сериализовывать/десериализовывать данные в JSON не нужно. Однако, это самый простой сценарий, вероятно, в каких-то случаях картина будет иная. Из минусов client-side: 1. На данный момент не известно когда оно вообще в релиз уйдёт и в каком виде. 2. Ограничено 'netstandard' (но тут я не могу оценить, насколько это вообще имеет значение). 3. Лишний код для общения с API (даже если автогенерируемый, даже если расшарить DTO). Из возможных минусов server-side: 1. Не известно, как оно будет держать коннект в условиях плохого инета (большой пинг, потери пакетов). И не только держать коннет, но и просто откликаться на действия пользователя. 2. Не могу оценить масштабы, но очевидно, что нагрузка на сервер будет выше, чем при client-side. Хотя, вероятно, в условиях пары сотен вялых пользователей это вообще значения не имеет. 3. Пока не видится возможным реализовать красивую аутентификацию без перезагрузки приложения при login/logout.
0
|
|
|
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,929
|
|||||
| 27.06.2019, 10:04 | |||||
|
Самое страшное, что я вижу в server side - это любители понаоткрывать вкладок и уйти на обед\домой. Какой-нибудь ВКонтакте я бы побоялся на этой технологии строить) А вот ИС... Если честно, то я бы попробовал. Очень уж интересная и перспективная технология. Везде C#, никаких тебе ангуляров и прочих jQuery. Добавлено через 48 минут kotelok, я думаю, что вы можете поизвести простой "краш-тест". Можно взять какую-нибудь базу (совершенно любую) и вытащить из неё справочник на сотню (больше, думаю, не стоит) значений. Список клиентов там из учебной базы Northwind или ещё чего. Лишь бы данных было достаточно, чтобы выглядело как настоящее. Потом в компоненте в список выгрузить (чтобы в памяти торчало) и отрендерить в виде таблицы. И прикрутить какую-нибудь кнопку, чтобы сортировать можно было записи (по одной колонке - больше не надо). И потыкать это дело. Сразу будет видно какой трафик идёт по WS. И таких вкладок двадцать отркыть можно, чтобы потребление ОЗУ на сервере оценить. Т.е. я предлагаю макет сделать, чтобы лично посмотреть на что server side способен. Было бы классно, если бы вы такое провернули и результаты нам озвучили.
1
|
|||||
|
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,759
|
||||||||||||||||
| 27.06.2019, 12:14 [ТС] | ||||||||||||||||
Сообщение было отмечено Usaga как решение
Решение
Пробовал модифицировать пример из туториала - страничку с таблицей прогноза погоды заполнял рандомной сотней записей (4 колонки) с полным обновлением списка записей по таймеру раз в секунду. Без базы данных. Без инструментов/графиков, просто немного ручного наблюдения.
Релизная сборка, селф-хост: 1. Стартовые 10 закладок: память с нуля выросла до 160МБ и там стабилизировалось. 2. Ещё +10 закладок (итого 20). Память сервера подросла до 164МБ. 3. Ещё +10 закладок (итого 30). Память сервера снизилась до 150МБ. 4. Ещё +10 закладок (итого 40). Память сервера попрыгала в разные стороны и упала до 92МБ. 5. Ещё +10 закладок (итого 50). Память сервера выросла до 150МБ. В целом, память ведёт себя весьма странно, вероятно, это связано с работой сборщика мусора, который подчищает тысячи брошенных массивов 'WeatherForecast[]' по какой-то своей логике. Например (при открытых 50 закладках) в какой-то момент память упала до 102МБ и осталась на этом уровне минут на 10. Потом быстро выросла до 150МБ и тоже стабилизировалась. Потом плавный рост до 180МБ, очистка до 82МБ и снова плавный рост. Потребление процессора на всех этапах: 1. Сервер (селф-хост-экзешник): 0-2%. 2. Хром-процессы с закладками: 0-1% (памяти каждый из них потребляет по 20-50МБ). Генерация данных
Код страницы
Разметка
Добавлено через 4 минуты А трафик я не нашёл как посмотреть. В Хроме на закладке 'Network' засвечивается 'wss://localhost:5001/_blazor?id=6uyGySTWUHRSn1kHcyBGDQ' в состоянии 'Pending', но никакой активности/статистики по нему не отображается.
1
|
||||||||||||||||
|
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,929
|
||
| 27.06.2019, 12:21 | ||
|
kotelok, память себя так ведёт из-за сборки мусора. Это нормально. В общем и целом, потребление ниочём.
0
|
||
|
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,759
|
||
| 27.06.2019, 12:29 [ТС] | ||
|
1
|
||
|
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,929
|
|
| 27.06.2019, 13:49 | |
|
kotelok, ну, вполне себе нормально. Прилетают сами данные, плюс какой-то diff для DOM'а. Что-то среднее между чистым JSON и классическим серверным рендерингом.
0
|
|
|
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,759
|
|
| 27.06.2019, 22:22 [ТС] | |
|
[1]
С кастомной аутентификацией разобрался. Но красиво не получается, только через редиректы. Кратко суть: 1. По кнопке логина делается редирект на обычную статичную razor-страницу ввода логина/пароля (и прочего логин-функционала). 2. Там пользователь вводит логин/пароль и обычным POST-запросом выполняет аутентификацию, которая в ответ возвращает HTTP-куку, в которую сложены данные об аккаунте. Браузер сохраняет куку и при последующих коннектах включает её в соответствующий HTTP-заголовок. 3. После этого происходит обычный редирект обратно на Blazor-приложение. Приходит HTTP-коннект с полученной в п.2. кукой аутентификации, которая через дефолтный мидлвар аутентификации разбирается и раскладывается в объект 'HttpContext.User' текущей сессии (Scope). То же самое происходит при открытии новых вкладок, полном рефреше странице или переоткрытии браузера. В п.2., для непосредственной проверки логина/пароля, можно использовать что угодно - прямой запрос к базе, логин/пароль-аутентификация на IS4. Так же можно этот п.2. заменить вовсе на редирект на какой-нибудь сторонний сервер аутентификации, который точно так же установит куку в случае успеха. Авторизацию пока не разбирал, но там, вроде, уже не должно сложностей возникнуть. [2] Как грамотно избавиться от редиректа и от необходимости для аутентификации покидать blazor-приложение пока не знаю. Т.е. в теории можно, но только с понижением уровня безопасности: 1. В рамках текущего приложения отобразить страничку аутентификации (или модальное окно). По кнопке "вход" проверить логин/пароль по базе/сервису. 2. Самостоятельно сформировать куку и положить её в качестве обычной (не защищённой) в хранилище браузера. 3. В рамках текущего коннекта распарсить созданную куку в 'HttpContext.User' (то же самое, что делает мидлвар из п.4). Сгенерировать какое-нибудь событие, что юзер залогинился. Вероятно, через свою реализацию 'AuthenticationStateProvider'. 4. Реализовать свой мидлвар аутентификации, где как-то запрашивать (возможно ли?) эту пользовательскую куку от браузера, разбирать и самостоятельно формировать 'HttpContext.User' (так же, как в п.3). Это для повторых заходов в приложение после закрытия браузера или при открытии новых вкладок. Основная проблема - те куки, что возвращаются в рамках POST-запросов (обычная аутентификация через редирект), сохраняются в хранилище браузера с флагом HTTP-only. Насколько я понял, они защищены от доступа через JS, а потому украсть/модифицировать их сложнее, чем обычные куки (без флага HTTP), которые предполагается использовать в п.2. Т.е. в п.2. я в принципе не смогу сохранить защищённую куку на стороне браузера, только обычную доступную через JS. Ну и второй момент - надо как-то заставить бразер автоматически включать в инициализирующий запрос эту пользовательскую куку. По умолчанию он, почему-то, этого не делает, включает только HTTP-куки.
0
|
|
|
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,929
|
||
| 28.06.2019, 08:23 | ||
|
1. Вы классическим образом авторизируетесь, при установлении WebSocket-соединения прилетает и кука, данные из которой потом висят в сессии и используются в вашем Blazor-приложении. Плюсы: при перезагрузке страницы\переустановке соединения или открытии новой вкладки авторизация подтягивается автоматически. 2. Вы придумываете авторизацию в самом Blazor-приложении. Меняете route на свою страницу авторизации, запоминаете в сессии результаты авторизации. Плюсы: нет редиректа. Минусы: при разрыве соединения\перезагрузке\новой вкладке пользователя опять придётся пнуть на авторизацию. Добавлено через 4 минуты Мне кажется, что редирект на страницу авторизации не такое уж и неудобство)
1
|
||
| 28.06.2019, 08:23 | |
|
Помогаю со студенческими работами здесь
14
Аутентификация и авторизация с использованием БД MS ACCESS Client ASP.NET MVC + Angular и Server side ASP.NET WEB.API Авторизация пользователя в SQL Server Dialog Server Side.help React Server-side рэндеринг Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|