IdentityTokenLifetime到期时用户未经过身份验证

时间:2017-10-12 18:18:57

标签: asp.net authentication identityserver3

刷新IdentityToken的正确方法是什么。我们正在使用隐式流程。

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
    {
        ClientId = ConfigurationManager.AppSettings["IdSrv.ClientId"],
        Authority = ConfigurationManager.AppSettings["IdSrv.Authority"],

        AuthenticationType = "MySTS",

        ResponseType = "id_token token",                  //Implicit Flow 

        Scope = "openid name email",

        RedirectUri = ConfigurationManager.AppSettings["IdSrv.RedirectUri"],
        PostLogoutRedirectUri = ConfigurationManager.AppSettings["IdSrv.PostLogoutRedirectUri"],

        SignInAsAuthenticationType = "OAuth Bearer",
    });

IdentityTokenLifetime默认为300(= 5分钟)。当该时间到期时,不再对用户进行身份验证。我们应该返回状态401(并传递prompt=none),那么中间件会重定向到IdentityServer3并再次返回吗?还有另一种方式吗?

2 个答案:

答案 0 :(得分:0)

理论上:

  1. 当用户通过openId登录时,您可以增加cookie的ttl,并通过此cookie对用户进行身份验证。如果cookie过期,那么您可以返回401或重定向再次登录。
  2. 身份服务器应提供刷新令牌(通过api),如果需要,它将用于获取另一个访问令牌。
  3. 另一个想法:通常,出于安全原因,访问令牌仅在有限的时间段内提供

答案 1 :(得分:0)

默认情况下,ASP.NET OIDC OWIN中间件使用身份令牌生存期作为您的应用将发布的cookie的生命周期。这似乎是WS-Federation OWIN中间件的遗留问题,其中传入令牌的寿命更长。由于身份令牌是短暂的,通常只使用一次然后丢弃,因此这种行为对OpenID Connect并不起作用。

所以你有两个选择:

  1. 在IdentityServer中为该客户端设置更高的身份令牌生存期(使用IdentityTokenLifetime实体上的Client属性。)
  2. 阻止OIDC中间件使用身份令牌生存期作为cookie生存期。这将允许您的cookie middelware控制会话生命周期。
  3. 您可以将UseTokenLifetime设置为false:

    来执行此操作
    app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions {
        // rest of your settings
        UseTokenLifetime = false
    }