我有一个使用FormsAuthentication
的现有MVC4应用程序(.NET 4.5),我希望切换到使用SessionAuthenticationModule
,这样我就可以获得声明,并且可以轻松获得数据到身份,并作为最终通过WIF(Windows Identity Foundation)与ADFS(Active Directory联合服务)等STS(安全令牌服务)服务进行身份验证的第一步,但这一切都将在以后发生。
我的问题是,什么决定用户的超时 使用SessionAuthenticationModule进行身份验证?
我使用this page让我的身份验证正常工作,似乎工作正常。基本上我的身份验证看起来像这样。
来自我的登录操作方法的片段
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出现在浏览器中,有效期为“Session”,我不知道为什么,但即使cookie对会话有效,也不应该在1分钟后令牌,身份或任何你想要调用的内容过期并强制用户重新登录?
答案 0 :(得分:3)
我曾经遇到类似的问题,这是我的问题,其中包含我在令牌到期时使Cookie无效的方法
How to set the timeout properly when federating with the ADFS 2.0
添加一些不同的逻辑可以让你滑动过期
web.config - 设置MaxClockSkew
<system.identityModel>
<identityConfiguration>
<securityTokenHandlers>
<securityTokenHandlerConfiguration maximumClockSkew="0">
</securityTokenHandlerConfiguration>
</securityTokenHandlers>
</identityConfiguration>
</system.identityModel>