Javascript - при нажатии кнопки, перенаправить на страницу входа, если не прошел проверку подлинности
Я унаследовал приложение MVC с jQuery и Kendo. Большинство действий контроллера имеют атрибут [Authorize], и он прекрасно обрабатывает перенаправление на страницу входа в систему, если пользователь еще не аутентифицирован.
Однако есть одна особенность, которая требует некоторой дополнительной информации, прежде чем вызывать действие. Таким образом, когда кнопка для этой функции нажата, отображается окно Kendo, запрашивающее у пользователя ввод DateTime. Затем вызывается действие с этим дополнительным фрагментом входных данных, и пользователь отправляется на другую страницу после завершения действия с результатом этого действия.
Вот упрощенный поток кода:
btnClicked_Listener{
// Pop-up Kendo window for DateTime input
// Get URL for action (@Url.Action("MyAction1", "MyController", new { date = [DateTime input] })
$.ajax({
datatype: 'json',
url: finalUrl,
cache: false,
success: function (result) {
window.location.href = window.location.origin + '/MyController/MyAction2?planId=' + result;
},
error: function (xhr, error, message) {
handleError(xhr, error, message);
}
});
Это работает нормально, если пользователь уже вошел в систему. Но если пользователь еще не вошел в систему, вот что происходит:
- Всплывающие окна Kendo для ввода даты и времени.
- Отображается страница входа (поскольку MyAction1 имеет атрибут [Authorize]).
- Пользователь входит в систему.
- Страница '/MyController/MyAction2? PlanId=' недопустима, поскольку MyAction1 никогда не получает удар, и поэтому result=null.
Как это исправить, когда код Javascript может определить, вошел ли пользователь в систему или нет, и вместо этого направить его на страницу входа?
Я не хочу скрывать кнопку, если пользователь не аутентифицирован. Я хочу, чтобы пользователь мог нажать на кнопку, но вместо этого меня перенаправили.
Спасибо за любую помощь!
1 ответ
Вы можете смешивать код на стороне сервера и код JavaScript, чтобы проверить, вошел пользователь в систему или нет.
<script>
btnClicked_Listener
{
@if (User.Identity.IsAuthenticated)
{
<text>
// Pop-up Kendo window for DateTime input
// Get URL for action (@Url.Action("MyAction1", "MyController", new {date = [DateTime input]})
$.ajax({
datatype: 'json',
url: finalUrl,
cache: false,
success: function (result) {
window.location.href = window.location.origin + '/MyController/MyAction2?planId=' + result;
},
error: function (xhr, error, message) {
handleError(xhr, error, message);
}
});
</text>
}
else
{
<text> window.location.href = 'Login page url' </text>
}
}
</script>
Редактировать: Если вы хотите поместить свой JS-код во внешний файл, вы должны поместить свой код в функцию, а затем передать в функцию значение bool, которое указывает, аутентифицирован ли пользователь или нет.
Внешний JS
function handleButtonClick(isAuthenticated) {
btnClicked_Listener
{
if (isAuthenticated) {
// Pop-up Kendo window for DateTime input
// Get URL for action (@Url.Action("MyAction1", "MyController", new {date = [DateTime input]})
$.ajax({
datatype: 'json',
url: finalUrl,
cache: false,
success: function(result) {
window.location.href = window.location.origin + '/MyController/MyAction2?planId=' + result;
},
error: function(xhr, error, message) {
handleError(xhr, error, message);
}
});
} else {
window.location.href = 'Login page url';
}
}
}
и внутри вашей HTML-страницы вызовите эту функцию:
<script>
$(function() {
handleButtonClick(@User.Identity.IsAuthenticated);
});
</script>