将FormsAuthentication替换为SessionAuthenticationModule(SAM)以生成声明感知标识

时间:2013-05-14 19:22:11

标签: asp.net authentication wif claims-based-identity

我有一个使用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 timeoutforms timeoutvalidTo参数设置为1分钟,但即使在此过后,我仍然可以访问该网站。 cookie出现在浏览器中,有效期为“Session”,我不知道为什么,但即使cookie对会话有效,也不应该在1分钟后令牌,身份或任何你想要调用的内容过期并强制用户重新登录?

1 个答案:

答案 0 :(得分:3)

我曾经遇到类似的问题,这是我的问题,其中包含我在令牌到期时使Cookie无效的方法

How to set the timeout properly when federating with the ADFS 2.0

添加一些不同的逻辑可以让你滑动过期

http://brockallen.com/2013/02/17/sliding-sessions-in-wif-with-the-session-authentication-module-sam-and-thinktecture-identitymodel/

web.config - 设置MaxClockSkew

<system.identityModel>
  <identityConfiguration>
    <securityTokenHandlers>
      <securityTokenHandlerConfiguration maximumClockSkew="0">
        </securityTokenHandlerConfiguration>
    </securityTokenHandlers>
  </identityConfiguration>
</system.identityModel>