Blazor Security - Пользовательская аутентификация / безопасность Razor Pages - PullRequest
7 голосов
/ 17 января 2020

Я пытаюсь создать приложение Blazor, которое размещено на сервере, и отправная точка находится внутри страницы бритвы. Что-то в этом роде:

<component type="typeof(Main)" render-mode="ServerPrerendered" param-Data="@simple"/>

Мои вопросы:

  • Что произойдет, если на странице бритвы есть Авторизованный атрибут, весь ли код блейзера чем правильно защищен при аутентификации?
  • Разве невозможно вызвать приложение блейзора без идентификатора схемы страницы бритвы?
  • Что если моя страница бритвы имеет собственную аутентификацию, основанную на значениях базы данных в методе OnGetAsync - мне нужно переделать некоторые из этих вещей внутри Blazor, или компонент Stateful отображается только тогда, когда работает страница бритвы?

  • Что произойдет, если у меня будет произвольный блок if / else, который будет вызов кнопки, этот вызов кнопки будет охраняться государством?

Что-то в этом роде:

@if (HasPermission)
{
   <button type="button" onclick="MutateDatabase">MutateDatabase</button>
}

1 Ответ

2 голосов
/ 26 января 2020

Я предполагаю, что вы запускаете Blazor Server (на момент написания WASM все еще находится в режиме предварительного просмотра и будет совершенно отличаться в плане безопасности).

Документ утверждает, что Blazor действительно интегрируется с ASP. NET Идентификатор ядра:

Приложения Blazor Server включают встроенную службу AuthenticationStateProvider, которая получает данные о состоянии проверки подлинности от ASP. NET HttpContext.User ядра. Вот как состояние аутентификации интегрируется с существующими ASP. NET Базовыми механизмами аутентификации на стороне сервера.

Теперь к вашим вопросам:

  1. Дано В вашем режиме рендеринга, чтобы Blazor включился, страница Razor должна отобразить начальное состояние и пометить элемент, где Blazor будет управлять представлением позже. Способ AuthorizeAttribute работает (я полагаю, это то, что вы имели в виду?) Блокирует отрисовку страницы, поэтому это должно помешать запуску Blazor вообще - вас перенаправят на аутентификацию. Как только ваши пользователи пройдут эти ворота, имейте в виду, что Blazor по-разному обрабатывает [Authorize] на дочерних элементах управления :

    Используйте только [Authorize] на @page компонентах, доступных через Blazor Router. Авторизация выполняется только как аспект маршрутизации, а не для дочерних компонентов, отображаемых на странице. Чтобы разрешить отображение определенных c деталей на странице, используйте AuthorizeView.

    (это не похоже на ваш случай, но я бы поставил его здесь на всякий случай )

  2. Я не совсем уверен, понимаю ли я здесь следующее утверждение: circuit - это термин, используемый MS для идентификации среза сервера, на котором находится экземпляр вашего приложения живет, пока отображается клиенту. Соединение поддерживается через веб-сокеты и, как правило, ограничено сеансом (проверьте файлы cookie и параметры URL для конечной точки /_blazor). Однако пользователю не гарантируется наличие одной и той же схемы в течение всего жизненного цикла приложения (из-за проблем с подключением или конфигурации балансировщика нагрузки сервера) - и это нормально, вы должны сами обрабатывать состояние персистентность в каналах .

  3. Я полагаю, что этот случай будет таким же, как (1): вы не сможете запустить Blazor, пока не будет отображено представление Razor.
  4. Вероятно, лучше следовать примеру Blazor. страница управления безопасностью : у вас есть несколько вариантов, чтобы обеспечить обслуживание аутентифицированных пользователей:

    1. Используйте <AuthorizeView> для управления тем, что визуализируется:

    <AuthorizeView>
    <Authorized>
        <button type="button" onclick="MutateDatabase">MutateDatabase</button>
    </Authorized>
    <NotAuthorized>
        <p>You're not signed in.</p>
    </NotAuthorized>
    </AuthorizeView>
    

    Технически вы можете использовать оператор if (user.IsInRole()), но может не обновляться при изменении User AuthenticationState .

    Если этого недостаточно, вы можете либо выбрать каскадный AuthenticationState параметр , либо посмотреть , реализующий собственный AuthenticationStateProvider

...