ChallengeAsync () из HttpContext не перенаправляет - PullRequest
0 голосов
/ 20 декабря 2018

У нас есть приложение javascript, «обернутое» в приложении ASP Core MVC.Каждый AJAX-запрос от приложения javascript попадает в контроллер, украшенный [Authorize].

В нашем методе запуска мы определили схему AuhenticationScheme, указывающую на наш Identity Server.А затем еще одна схема для файлов cookie, в которой они в конечном итоге регистрируются как.

Чтобы обеспечить проверку подлинности всех входящих запросов, мы используем следующее:

 app.Use(async (context, next) =>
            {
                if (!context.User.Identity.IsAuthenticated)
                {
                    string auth = context.Request.Headers["Authorization"];
                    if (string.IsNullOrEmpty(auth) ||     !auth.StartsWith("Bearer ", System.StringComparison.OrdinalIgnoreCase))
                    {
                        await context.ChallengeAsync("oidce", new     AuthenticationProperties {
                             RedirectUri = "/"
                        });
                    }
                    else
                    {
                        await next();
                    }
                }
                else
                {
                    await next();
                }
            });

Теперь, если срок действия файла cookie истекаетзапускает ChallengeAsync, который на самом деле не работает, если вызов исходил из запроса AJAX, сделанного из браузера.Я подумал, так как у меня был контекст здесь, что он просто переопределит AJAX и заставит браузер запустить двустороннюю передачу.

Есть ли способ сказать браузеру, что «нет, это не AJAX-ответ, иди куда я тебе скажу "?

1 Ответ

0 голосов
/ 21 декабря 2018

Как отметил Ценг в комментариях, я реализовал это почти до буквы.

app.Use(async (context, next) =>
            {
                if (!context.User.Identity.IsAuthenticated)
                {
                    if (context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
                    {
                        // webapp will then do a location.reload() which triggers the auth
                        context.Response.StatusCode = 401;
                    }
                    else
                    {
                        string auth = context.Request.Headers["Authorization"];
                        if (string.IsNullOrEmpty(auth) || !auth.StartsWith("Bearer ", System.StringComparison.OrdinalIgnoreCase))
                        {
                            await context.ChallengeAsync();
                        }
                        else
                        {
                            await next();
                        }
                    }  
                }
                else
                {
                    await next();
                }
            });

Затем приложение javascript перехватывает исключение Ajax и проверяет, имеет ли статус 401, и просто выполняет window.location..reload ()

Не элегантное решение, возможно, переписать в будущем, но оно решит непосредственную проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...