3

私は既存の MVC4 アプリ (.NET 4.5) を使用FormsAuthenticationしてSessionAuthenticationModuleおり、ID への簡単な追加データと、最終的にはADFS (Active Directory Federation Services) のような STS (Security Token Service) サービスを使用して WIF (Windows Identity Foundation) を介して認証を実行しますが、それはすべて後で行います。

私の質問は、ユーザーが 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..... */
}

しかし、これに関して私が持っていた唯一の懸念は、ユーザーがログインの有効期限が切れたときに再ログインを求められないように、有効期限のスライドの動作を保持したいということですが、この問題に取り組んでいると、見つからないことに気付きました彼らがログインしている時間を決定するもの。session timeoutform timeout、および SessionSecurityToken コンストラクターのvalidToパラメーターを 1 分に設定しましたが、それが経過してもサイトにアクセスできます。Cookie は「セッション」の有効期限日でブラウザに表示されますが、その理由はわかりませんが、Cookie がセッションに対して有効であっても、トークン、ID、または呼び出したいものが 1 分後に期限切れになることはありません。ユーザーに再ログインを強制しますか?

4

1 に答える 1

3

私はかつて同様の問題を抱えていました。これは、トークンの有効期限が切れたときに Cookie を無効にする私のアプローチを含む私の質問です。

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>
于 2013-05-14T19:37:11.660 に答える