Как установить тайм-аут сеанса с веб-сайта после периода бездействия при использовании аутентификации OpenIdConnect вместе с IdentityServerV3 - PullRequest
0 голосов
/ 22 мая 2019

У нас есть клиентское приложение (веб-сайт), которое использует IdSvr3 в качестве сервера идентификации для аутентификации пользователей.Мы используем поток аутентификации OpenIdConnect, встроенный в OWIN.Проблема в том, что, скажем, через 30 минут бездействия я хочу выйти из системы и потребовать, чтобы он или она снова вошли в систему с использованием учетных данных.Хотя файл cookie для проверки подлинности на веб-сайте становится недействительным, но веб-сайт перенаправляется на IdSvr, повторно проходит проверку подлинности (без предоставления учетных данных) и позволяет пользователю просматривать защищенные страницы.Я не уверен, как выйти из IdSever без явного запроса на выход.

public void ConfigureAuth(IAppBuilder app)
{
    string redirectUri = "http://mvcwebapp.local/";
    string idServBaseUri = "https://idsvr3/core";
    string tokenEndpoint = "https://idsvr3/core/connect/token";
    string userInfoEndpoint = "https://idsvr3/core/connect/userinfo";
    string clientId = "_Th4GVMa0JSrJ8RKcZrzbcexk5ca";
    string clientSecret = "a3GVJJbLHkrn9nJRj3IGNvk5eGQa";

    JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();

    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = "Cookies"
    });

    app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
    {
        ClientId = clientId,
        Authority = idServBaseUri,
        RedirectUri = redirectUri,
        ResponseType = "code id_token token",
        Scope = "openid profile roles clef",
        TokenValidationParameters = new TokenValidationParameters
        {
            NameClaimType = "name",
            RoleClaimType = "role"
        },
        SignInAsAuthenticationType = "Cookies",
        UseTokenLifetime = false,

        Notifications = new OpenIdConnectAuthenticationNotifications
        {
            AuthorizationCodeReceived = async n =>
            {
                // use the code to get the access and refresh token
                var tokenClient = new TokenClient(tokenEndpoint, clientId, clientSecret);

                var tokenResponse = await tokenClient.RequestAuthorizationCodeAsync(n.Code, n.RedirectUri);

                if (tokenResponse.IsError)
                {
                    throw new Exception(tokenResponse.Error);
                }

                // use the access token to retrieve claims from userinfo
                var userInfoClient = new UserInfoClient(userInfoEndpoint);

                var userInfoResponse = await userInfoClient.GetAsync(tokenResponse.AccessToken);

                // create new identity
                var id = new ClaimsIdentity(n.AuthenticationTicket.Identity.AuthenticationType);
                id.AddClaims(userInfoResponse.Claims);
                id.AddClaim(new Claim(ClaimTypes.NameIdentifier, userInfoResponse.Claims.FirstOrDefault(c => c.Type == "preferred_username")?.Value));
                id.AddClaim(new Claim("access_token", tokenResponse.AccessToken));
                id.AddClaim(new Claim("expires_at", DateTime.Now.AddSeconds(tokenResponse.ExpiresIn).ToLocalTime().ToString(CultureInfo.InvariantCulture)));
                id.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken));
                id.AddClaim(new Claim("sid", n.AuthenticationTicket.Identity.FindFirst("sid").Value));

                n.AuthenticationTicket = new AuthenticationTicket(
                    new ClaimsIdentity(id.Claims, n.AuthenticationTicket.Identity.AuthenticationType, "name", "role"),
                    n.AuthenticationTicket.Properties);
                n.AuthenticationTicket.Properties.RedirectUri = n.RedirectUri;
                n.AuthenticationTicket.Properties.ExpiresUtc = DateTime.UtcNow.AddSeconds(120);
            },

            RedirectToIdentityProvider = n =>
            {
                // if signing out, add the id_token_hint
                if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.LogoutRequest)
                {
                    var idTokenHint = n.OwinContext.Authentication.User.FindFirst("id_token");

                    if (idTokenHint != null)
                    {
                        n.ProtocolMessage.IdTokenHint = idTokenHint.Value;
                    }
                }

                return Task.FromResult(0);
            },
        }
    });
}
...