У меня есть приложение 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 сеанса"
- Если следующий вызов веб-приложения MVC будет выполнен без использования AJAX, ADAL MW, включенный в бэкэнд, обнаружит эту проблему и попытается автоматически обновить cookie. При выполнении этого действия вы видите, что веб-приложение подключается к Azure, а затем более или менее возвращается на исходную страницу вызова приложения надлежащим образом.
- Если следующий вызов веб-приложения 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, и я вижу ошибку.
Может кто-нибудь помочь мне решить эту проблему?