Перенаправление на страницу входа в систему с идентификатором ядра asp.net во ViewComponent - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь сделать мой viewcomponent доступным, только если пользователь вошел в систему. Я проверяю, не прошел ли аутентификация пользователя, затем перенаправляю на страницу входа, но следующий код дает мне ошибку

public IViewComponentResult Invoke(int? id)
        {

            if (!User.Identity.IsAuthenticated)
            {   
                return View("~/Areas/Identity/Pages/Account/Login.cshtml");
            }
//other stuff
}

но этот код выдает ошибку на странице входа в систему

ArgumentNullException: Value cannot be null.
Parameter name: viewData

При проверке loginviewmodel он имеет перегруженный конструктор, который принимает аргументы

public LoginModel(SignInManager<IdentityUser> signInManager, ILogger<LoginModel> logger)

Я не могу понять, как отправить эти aruguments. Или есть лучший способ перенаправить на страницу входа

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Вы читали это: https://docs.microsoft.com/en-us/aspnet/core/mvc/views/overview?view=aspnetcore-2.2

При использовании return View() ASP.net ищет в папке Views папку с именем вашего контроллера и представление с именем метода. Поэтому, когда вы используете return View() в методе Profile of AccountController, asp.net ищет представление в Views / Account / Profile.cshtml.

Метод представления дополнительно принимает параметр. Здесь вам нужно передать модель представления (данные, которые вы хотите отобразить в представлении)

Кроме того, если вы хотите авторизовать доступ к методу контроллера, вам следует использовать авторизацию на основе ролей или утверждений: https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles?view=aspnetcore-2.2

0 голосов
/ 13 мая 2019

Компоненты представления не являются частью конвейера авторизации. Они являются частью конвейера рендеринга представления, и к тому времени уже слишком поздно отказывать в доступе или перенаправлении. Если компонент представления не должен отображаться, если пользователь не вошел в систему, просто верните пустой результат, т.е. return Content(string.Empty);. В качестве альтернативы, вы можете оставить это в своем представлении:

@if (User.Identity.IsAuthenticated)
{
    @await Component.InvokeAsync("MyComponent")
}

Последняя часть вашего вопроса - я думаю, полное недопонимание того, как все здесь работает. Компонент представления - это просто способ рендеринга частичного при выполнении какой-то дополнительной работы, которую частичный не может или не должен обрабатывать напрямую, например, внедрение зависимостей, запрос базы данных и т. Д. Здесь вы пытаетесь вернуть Страница бритвы, которая является не частичной. Страницы Razor работают только тогда, когда они напрямую направлены. Зависимости, которые вы не можете понять, как удовлетворить, удовлетворяются платформой во время создания модели страницы после маршрутизации.

...