.NET Core MVC / Azure AD - 302 Найдено при выполнении запроса AJAX - PullRequest
0 голосов
/ 03 октября 2018

Я использую Azure AD вместе с ядром asp.net mvc.Следующий код аналогичен стандартному проекту MVC, созданному с аутентификацией Work или School Accounts.

services.Configure<CookiePolicyOptions>(options =>
{
    options.CheckConsentNeeded = context => true;
    options.MinimumSameSitePolicy = SameSiteMode.None;
});    
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
                    .AddAzureAD(options => Configuration.Bind("AzureAd", options));
services.AddMvc(options =>
{
    var policy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
    options.Filters.Add(new AuthorizeFilter(policy));
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

В большинстве случаев все работает просто отлично.Приложение в основном блокнот.Пользователь входит в систему и добавляет заметки / задачи.Все после входа в систему делается с помощью запросов ajax.Через некоторое время приложение перестает работать, потому что снова требуется аутентификация.Обратите внимание, что если я обновлю страницу, все снова будет работать.

enter image description here

Я делаю это правильно?Я что-то упустил, или этот вид использования не поддерживается.

Должен ли я просто создать функцию javascript, которая автоматически обновит страницу через некоторое время?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

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

public IActionResult Check()
{
    return Ok(new { });
}

Я оставил инструменты разработчика открытыми и заметил, что каждые 30 минут яполучите больший отклик.

enter image description here

И это фактически обновляет cookie и в результате нет необходимости перенаправлять пользователя.

Таким образом, чтобы подвести итог, кто-то должен делать эту проверку каждые 40-50 минут, потому что срок действия по умолчанию установлен на ~ 1 час.

0 голосов
/ 04 октября 2018

Должен ли я просто создать функцию javascript, которая будет автоматически обновлять страницу через некоторое время?

Можно попробовать создать скрытый iframe во всех шаблонах, используемых веб-приложением для делает автоматические вызовы к контроллеру MVC метод, который заставляет регулярно обновлять данные аутентификации на регулярной основе.

Это достигается очень легко путем настройки автоматического JavaScriptпроцесс во внешнем интерфейсе выполняется в цикле на регулярной основе 45 '.Это значение также можно настроить или извлечь из файла конфигурации.Единственным ключевым условием является то, что он должен быть менее одного часа.

Вот упрощенный пример кода, относящийся к контроллеру MVC:

/* Action method, inside "Account" controller class, to force renewal of user authentication session */
public void ForceSignIn() 
{
   HttpContext.GetOwinContext().Authentication.Challenge(new AuthenticationProperties { RedirectUri = "/" }, 
   OpenIdConnectAuthenticationDefaults.AuthenticationType); 
}

А вот упрощенный пример кода HTML и JavaScriptиспользуется для тихого вызова в скрытом iframe в MVC Controller:

<iframe id="renewSession" hidden></iframe> 
 <script> 
     setInterval( function () 
         { @if (Request.IsAuthenticated) {
                 <text> 
                 var renewUrl = "/Account/ForceSignIn"; 
                 var element = document.getElementById("renewSession"); 
                element.src = renewUrl; 
                 </text> 
             }
         }, 
         1000*60*45
       );
   </script>

Для получения более подробной информации, вы можете обратиться к этой статье , в которой возникает аналогичная ситуация с вами.

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