Принудительный выход из системы клиента IdentityServer Asp.net по таймауту - PullRequest
0 голосов
/ 30 мая 2018

У меня проблема с таймаутами и Identityserver.В настоящее время у меня есть клиент веб-форм, авторизованный через Identityserver, который выдает cookie.После 10 минут бездействия этот файл cookie истекает, и пользователь направляется в конечную точку аутентификации и автоматически повторно авторизуется с идентификацией.Можно ли обойти этот шаг повторной авторизации и автоматически выйти из системы?В противном случае, это еще один способ, которым пользователь может быть вынужден перейти на страницу входа в личность.В идеале я бы не хотел, чтобы другие клиенты, авторизованные через тот же сервер идентификации, имели это правило десяти минут ожидания.Моя текущая настройка выглядит следующим образом:

Запуск клиента:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.SetDefaultSignInAsAuthenticationType("Cookies");

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = "Cookies",
            ExpireTimeSpan = TimeSpan.FromMinutes(10),
            SlidingExpiration = true
        });

        app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
        {
            AuthenticationType = "oidc",
            Authority = "IdentityUrl",
            ClientId = "ClientId",
            ClientSecret = "ClientSecret",
            RedirectUri = "RedirectUri",
            ResponseType = "code id_token",
            Scope = "scopes",
            PostLogoutRedirectUri = "PostLogoutRedirectUri",
            RequireHttpsMetadata = true,
            UseTokenLifetime = false,
            Notifications = new OpenIdConnectAuthenticationNotifications
            {
                RedirectToIdentityProvider = context =>
                {
                    if (context.ProtocolMessage.RequestType == OpenIdConnectRequestType.Logout)
                        context.ProtocolMessage.IdTokenHint = context.OwinContext.Authentication
                                                                                 .User.FindFirst(Constants.ResponseTypes.IdToken)?.Value;

                    return Task.FromResult(0);
                },
                SecurityTokenValidated = n =>
                {
                    var id = n.AuthenticationTicket.Identity;

                    id.AddClaim(new Claim(Constants.ResponseTypes.IdToken, n.ProtocolMessage.IdToken));
                    n.AuthenticationTicket = new AuthenticationTicket(id, n.AuthenticationTicket.Properties);

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

        app.UseStageMarker(PipelineStage.Authenticate);

    }
}

Default.aspx

public partial class _Default : HSTPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Context.Request.IsAuthenticated) Response.Redirect("HomePageUrl");
        else
        {
            HttpContext.Current.GetOwinContext().Authentication.Challenge(new AuthenticationProperties
            {
                RedirectUri = "CallBackUrl"
            });
        }
    }
}

и, наконец, конфигурация сервера идентификации

var idpAssemblyName = GetAssemblyName<Startup>();
        services.AddIdentityServer()
                .AddSigningCredential(LoadCertificateFromStore(_configuration))
                .AddConfigurationStore(storeOptions => storeOptions.ConfigureDbContext = builder => builder.UseSqlServer(connectionString, options => options.MigrationsAssembly(idpAssemblyName)))
                .AddOperationalStore(storeOptions => storeOptions.ConfigureDbContext = builder => builder.UseSqlServer(connectionString, options => options.MigrationsAssembly(idpAssemblyName)))
                .AddAspNetIdentity<IdentityUser>();

1 Ответ

0 голосов
/ 31 мая 2018

Добавьте Challenge() в ваше RedirectToIdentityProvider уведомление:

RedirectToIdentityProvider = context =>
{
    if (context.ProtocolMessage.RequestType == OpenIdConnectRequestType.Logout)
        context.ProtocolMessage.IdTokenHint = context.OwinContext.Authentication
                                                                 .User.FindFirst(Constants.ResponseTypes.IdToken)?.Value;

    if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.Token)
    {
        n.OwinContext.Authentication.Challenge();
    }

    return Task.FromResult(0);
},
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...