Сбой Ajax-запроса для приложения asp.net mvc, использующего протокол AzureAD OIDC, когда истекает срок действия файла cookie сеанса - PullRequest
0 голосов
/ 06 июня 2019

У меня есть приложение asp.net mvc 5, которое использует протокол OpenID Connect (OIDC) для проверки подлинности в Azure Active Directory (Azure AD). Когда пользователь начинает новый сеанс с помощью MVC Web App, возвращается новый файл cookie для управления этим сеансом. Этот «файл cookie сеанса» создается на основе «идентификатора токена», и пока этот файл cookie действителен, пользователь будет считаться аутентифицированным в MVC Web App. Здесь по умолчанию «id_token» будет длиться один час, и эта длительность будет такой же для «cookie сессии»

Я перешел по следующим ссылкам для реализации

https://jamuro -blog.azurewebsites.net / пост / управление-лазурь-ад-сессии-и-Ajax-вызовы-в-САШ-MVC-приложения-с-открытым ид-подключения-аутентификации http://www.cloudidentity.com/blog/2016/07/25/controlling-a-web-apps-session-duration-2/

Вот мой код:

Startup.cs

public partial class Startup
{
  public void ConfigureAuth(IAppBuilder app)
        {
            app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
            app.UseKentorOwinCookieSaver();
            app.UseCookieAuthentication(new CookieAuthenticationOptions()
            {
                CookieSecure = CookieSecureOption.Always                
            });
            app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions()
            {
                ClientId = clientId,
                Authority = authority,
                TokenValidationParameters = new TokenValidationParameters()
                {
                    ValidateAudience = true,
                    ValidateIssuer = true
                },
                Notifications = new OpenIdConnectAuthenticationNotifications()
                {
                    AuthorizationCodeReceived = new Func<AuthorizationCodeReceivedNotification, Task>(this.OnAuthorizationCodeReceived),
                    AuthenticationFailed = new Func<AuthenticationFailedNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions>, Task>(this.OnAuthenticationFailed),
                    RedirectToIdentityProvider = (RedirectToIdentityProviderNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> context) => {
                        string appBaseUrl = string.Concat(new object[] { context.Request.Scheme, "://", context.Request.Host, context.Request.PathBase });
                        context.ProtocolMessage.RedirectUri = appBaseUrl;
                        context.ProtocolMessage.DomainHint = tenant;
                        return Task.FromResult(0);
                    }
                },
                UseTokenLifetime = true
            });
        }
}

Здесь, согласно моему анализу, значение SlidingExpiration истинно

app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
  CookieSecure = CookieSecureOption.Always                
});

Я также реализовал логику для возобновления сеанса с помощью iFrame, упомянутого в статье.

Единственная разница между статьей и моей реализацией заключается в том, что я не установил явно SlidingExpiration = false

Вот мои сценарии тестирования в случае истечения срока действия "cookie cookie сеанса"

  1. Если следующий вызов веб-приложения MVC будет выполнен без использования AJAX, ADAL MW, включенный в бэкэнд, обнаружит эту проблему и попытается автоматически обновить cookie. При выполнении этого действия вы видите, что веб-приложение подключается к Azure, а затем более или менее возвращается на исходную страницу вызова приложения надлежащим образом.
  2. Если следующий вызов веб-приложения MVC выполняется с использованием AJAX, я вижу проблему.

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

Вот время, которое я использовал для сценария тестирования:

10: 00 AM -> Я вошел в приложение и приземлился на Screen_1

10: 00 AM - 10:20 AM -> Я остался в Screen_1

10: 20 AM -> Я перешел к Screen_2

10: 20 - 10:40 -> Я остался в Screen_2

10: 40 AM -> Я перешел к Screen_3

10: 40 AM - 11:05 -> Я остался в Screen_3

11: 06 AM -> Я нажал кнопку, которая включает действие AJAX, и я вижу ошибку.

Может кто-нибудь помочь мне решить эту проблему?

...