Я проверил его в других приложениях и средах и заметил, что он работает в версии "yiisoft/yii2-redis": "2.0.8"
и в "yiisoft/yii2-redis": "2.0.9"
выдает ошибку ( sweelix \ rbac \ redisManager в строке 364 ]: $ruleGuid = $this->db->executeCommand('HGET', [$this->getRuleMappingKey(), $item->ruleName]);
). Если принудительно переключиться на версию пакета « 2.0.8 », ошибка исчезнет.
Я использую некоторый Javascript в моем MasterPage, чтобы перенаправить пользователя (после запроса на возобновление сеанса) к действию выхода из системы. Он использует запрос AJAX обратно на домашнюю страницу приложения, чтобы обновить окно сеанса на стороне сервера, когда пользователь нажимает кнопку в диалоговом окне, чтобы продлить сеанс. Для диалогового окна полагается на jQuery и пользовательский интерфейс jQuery.
<% if (this.Request.IsAuthenticated)
{
int sessionDialogWait = 2 * 60 * 1000 - 60 * 500; // ms = 1.5 minutes
int sessionTimeout = 28 * 60 * 1000; // ms = 28 minutes
if (ViewData["sessionTimeout"] != null)
{
sessionTimeout = ((int)ViewData["sessionTimeout"] * 60 - 120) * 1000;
}
%>
<script type="text/javascript">
var logoutTimer = null;
var sessionTimer = null;
var sessionTimeout = Number('<%= sessionTimeout %>');
var sessionDialogWait = Number('<%= sessionDialogWait %>');
$(document).ready( function() {
$('#sessionEndDialog').dialog( {
autoOpen: false,
bgiframe: true,
modal: true,
buttons: {
OK: function() {
$(this).dialog('close');
$.get( '<%= Url.Action( "About", "Home" ) %>', scheduleSessionPrompt, 'html' );
},
Logout: logoutOnSessionExpires
}
}).ajaxStart( function() { scheduleSessionPrompt(); } );
scheduleSessionPrompt();
});
function scheduleSessionPrompt()
{
if (logoutTimer) clearTimeout(logoutTimer);
if (sessionTimer) clearTimeout(sessionTimer);
sessionTimer = setTimeout( sessionExpiring, sessionTimeout );
}
function sessionExpiring()
{
logoutTimer = setTimeout( logoutOnSessionExpires, sessionDialogWait );
$('#sessionEndDialog').dialog('open');
}
function logoutOnSessionExpires()
{
window.location.href = '<%= Url.Action( "Logout", "Account" ) %>';
}
</script>
<% } %>
<div id="sessionEndDialog" title="Session Expiring" style="display: none;">
<p>Your session is about to expire. Click OK to renew your session or Logout to logout of the application.</p>
</div>
Я предполагаю, что вы каким-то образом аутентифицируете пользователя, но используете ли вы аутентификацию с помощью форм?:
ASP.Net MVC Framework - Использование аутентификации с помощью форм
Если вы ' Если уже используется проверка подлинности с помощью форм, необходимо убедиться, что срок действия cookie проверки подлинности немного короче, чем время ожидания сеанса.
У меня была такая же проблема со старым приложением ASP.net. Срок действия сеанса истекает, но пользователь все еще аутентифицирован, поскольку файлы cookie сеанса и аутентификации различны и не обязательно истекают одновременно. Тогда я использовал global.asax Session_Start, чтобы проверить, прошел ли пользователь аутентификацию, и вывести его из системы.
protected void Session_Start(Object sender, EventArgs e)
{
if (User.Identity.IsAuthenticated)
{
FormsAuthentication.SignOut();
Response.Redirect("~/SessionEnd.aspx");
}
}
Это заставляет пользователя, начинающего сеанс, снова войти в систему. Вы также можете использовать это событие для восстановления информации о сеансе из базы данных или, возможно, перенаправить его на другую страницу, но сохранить его учетные данные действительными.
Данные могут все еще находиться на странице, потому что браузер кэширует их.
Попробуйте добавить это и посмотрите, остались ли данные после завершения сеанса:
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">