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>
Другие вопросы по тегам