我有一个现有的 MVC4 应用程序(.NET 4.5),我正在使用FormsAuthentication
它,我希望切换到使用SessionAuthenticationModule
,这样我就可以获得一个声明识别身份,以便为身份提供简单的附加数据,并作为最终迁移到的第一步通过 WIF (Windows Identity Foundation) 使用 ADFS (Active Directory 联合服务) 等 STS (Security Token Service) 服务执行身份验证,但这一切都将在以后进行。
我的问题是,什么决定了使用 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..... */
}
但是我对此唯一担心的是我想保留滑动到期的行为,这样当他们的登录到期时不会提示用户重新登录,但是在解决这个问题时我注意到我找不到是什么决定了他们保持登录状态的时间。我已将 SessionSecurityToken 构造函数上的session timeout、forms timeout和validTo参数设置为 1 分钟,但即使在此之后,我仍然能够访问该站点。cookie 出现在浏览器中,到期日期为“会话”,我不知道为什么,但即使 cookie 对会话有效,令牌、身份或任何你想调用它的东西都不应该在 1 分钟后过期并强制用户重新登录?