#asp.net #blazor #roles #asp.net-authorization
#asp.net #blazor #роли #asp.net-авторизация
Вопрос:
В настоящее время я начинаю новый проект на сервере Blazor. Я настроил сайт в VS2019 и использовал шаблон аутентификации отдельных учетных записей.
У меня возникла проблема, пытаясь понять, как заставить сайт проверять текущие роли, назначенные пользователю при каждом просмотре страницы, в случае, если роли пользователя изменились.
Это мой компонент app.razor
<CascadingAuthenticationState>
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
<NotAuthorized>
@if (context.User.Identity.IsAuthenticated == false)
{
NavigationManager.NavigateTo($"/CustomLogin?ReturnURL={Uri.EscapeDataString(NavigationManager.Uri)}", true);
}
</NotAuthorized>
</AuthorizeRouteView>
<AuthorizeView>
<Authorized>
@*
..do something here to make sure that the roles of the user are still correct for the component page being accessed.
}*@
</Authorized>
</AuthorizeView>
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
</CascadingAuthenticationState>
Проблема, которую я вижу, заключается в том, что если я удаляю роль в таблице aspnetuserroles для пользователя в базе данных sql, изменения не вступают в силу до тех пор, пока пользователь не выйдет из системы и не вернется.
Например, в верхней части моего компонента управления пользователями будет такой тег: @attribute [Авторизовать (роли = «управление пользователями»)]
Однако, если я удалю роль usermanagement у этого пользователя, это не вступит в силу при перезагрузке страницы … только для выхода из системы и входа в систему.
Мое первоначальное предположение состояло в том, чтобы попытаться что-то сделать в авторизованном теге в app.razor выше, но не уверен, правильный ли это подход?
Как именно я мог заставить authenticationstateprovider выполнять проверку в реальном времени при каждом просмотре / перезагрузке новой страницы, а не только при выходе пользователя из системы?
Комментарии:
1. эта работа должна выполняться в вашем классе AuthenticationState, там вы должны подключиться к своему Api, который проверяет, находится ли пользователь в роли
2. Я прочитал, что нам следует избегать создания пользовательских классов аутентификации. Чего я не понимаю, так это почему встроенный authmanager не просматривает текущие роли, которым присваивается aspnetuser каждый раз, когда он рисует компонент, но, похоже, кэширует их учетные данные на весь период сеанса входа в систему.
3. Нет, вы должны создать свой собственный AuthenticationState, унаследовав от него.