Изменения роли Authenticationstate на сервере Blazor

#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, унаследовав от него.