У меня есть существующее приложение MVC4 (.NET 4.5), использующее FormsAuthentication
, на который я собираюсь перейти с помощью SessionAuthenticationModule
чтобы я мог получить информацию о заявках как для простых дополнительных данных для идентификации, так и в качестве первого шага к конечному переходу на выполнение аутентификации через WIF (Windows Identity Foundation) с помощью STS (Security Token Service). ), как ADFS (службы федерации Active Directory), но все это позже.
Мой вопрос: что определяет тайм-аут, когда пользователь аутентифицируется с помощью SessionAuthenticationModule?
Я использовал эта страница, чтобы моя аутентификация работала, и, похоже, она работает нормально. В основном моя аутентификация выглядит так.
Фрагмент из моего метода входа в систему
var personId = securityService.AuthenticateUser(model.Login, model.Password);
if (!personId.IsEmpty())
{
authenticationService.SignIn(personId, model.RememberMe);
if (Url.IsLocalUrl(model.ReturnUrl))
return Redirect(model.ReturnUrl);
else
return RedirectToAction("Index", "Home");
}
AuthenticationService.SignIn()
public void SignIn(Guid personId, bool createPersistentCookie)
{
var login = securityService.GetLoginByPersonId(personId);
if (String.IsNullOrEmpty(login.Name)) throw new ArgumentException("Value cannot be null or empty.", "userName");
var claims = LoadClaimsForUser(login.Name);
var identity = new ClaimsIdentity(claims, "Forms");
var claimsPrincipal = new ClaimsPrincipal(identity);
var token = new SessionSecurityToken(claimsPrincipal, ".CookieName", DateTime.UtcNow, DateTime.UtcNow.AddMinutes(30)) { IsPersistent = createPersistentCookie };
var sam = FederatedAuthentication.SessionAuthenticationModule;
sam.WriteSessionTokenToCookie(token);
}
AuthenticationService.LoadClaimsForUser()
private IEnumerable<Claim> LoadClaimsForUser(string userName)
{
var person = securityService.GetPersonByLoginName(userName);
if (person == null)
return null;
var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.NameIdentifier, person.PersonId.ToString()));
claims.Add(new Claim(ClaimTypes.Name, userName));
/* .... etc..... */
}
Но единственная проблема, с которой я столкнулся, заключается в том, что я хочу сохранить поведение скользящего истечения срока действия, чтобы пользователю не предлагалось повторно войти в систему по истечении срока его входа в систему, но при работе над этой проблемой я заметил, что не могу найти от того, что определяет, как долго они остаются в системе вообще. Я установил время ожидания сеанса. , время ожидания форм и validTo в конструкторе SessionSecurityToken на 1 минуту, но даже по истечении этого времени я Я все еще могу получить доступ к сайту. Файл cookie появляется в браузере с датой истечения срока действия «Сеанс», и я не уверен, почему, но даже если файл cookie действителен для сеанса, токен, личность или что-то еще, что вы хотите назвать, истекает через 1 минуту и заставить пользователя снова войти в систему?