ASP.NET Core: вызов компонента представления не учитывает атрибут авторизации
Я реализовал AspNetCore.Authorization и украсил классы контроллера [Authorize]
, Это работает, если я вызываю контроллер из браузера. Однако View Component может получить доступ к данным:
Посмотреть:
@foreach (Category category in Model) {
<a class="btn btn-block
asp-action="Index"
asp-controller="Note"
asp-route-categoryid=@category.CategoryID
asp-route-page="1">
@category.Name
</a>
Это приводит к тому, что компонент View был заполнен данными из @ category.Name, фактически недоступными в адресной строке браузера.
ViewComponent:
[Authorize]
public class NavigationMenuViewComponent : ViewComponent
{
private INoteRepository _Repository;
public NavigationMenuViewComponent(INoteRepository repository)
{
_Repository = repository;
}
public IViewComponentResult Invoke()
{
ViewBag.SelectedCategory = RouteData?.Values["category"];
return View(_Repository.Categories
.OrderBy(x => x.Name));
}
}
На самом деле я думал, что Authorize
Атрибут будет отклонять вызов от компонента представления, если на самом деле не вошел в систему. Как я могу получить такое поведение?
1 ответ
ViewComponents не участвует в жизненном цикле контроллера, что означает, что вы не можете использовать фильтры в компоненте представления. Итак Authorize
фильтр не будет выполнен.
Компонент View должен использовать свойство User (получает метод System.Security.Principal.IPrincipal для текущего пользователя.), Предоставляемое классом ViewComponent, для принятия решений или изменения выходных данных на основе содержимого свойства User. В зависимости от типа аутентификации, используемой приложением, вам необходимо проверить учетные данные пользователя.