首页 > 解决方案 > 重新启动 IdentityServer4 时,客户端应用程序 (oidc) 被重定向到登录

问题描述

我有一个 IdentityServer 的实现,它带有一个用于验证的外部提供程序和一个使用 oidc-client 库实现 oidc 隐式流的客户端应用程序。在 IdentityServer 关闭(例如由于不活动)之前,一切正常(登录、注销、刷新令牌、ecc...)。

当 IdentityServer 重新启动时,如果会话/令牌仍然有效,我的客户端也会被重定向到登录。我尝试使用 OperationalStore 或 InMemoryPersistedGrants,但是在重新启动服务且不关闭浏览器后,我的行为始终相同。就像任何会话/令牌存储在启用了 OperationalStore 的数据库中一样。相反,cookie 由浏览器会话正确保存,并允许在重新启动后浏览 IdentityServer 页面而不要求登录。

服务重启后重定向到登录的 API 调用(来自客户端)是这样的:IdS-server/connect/authorize?client_id=client-id&redirect_uri=redirectUri&response_type=code&scope=scopes&state=state&code_challenge=codeChallenge &code_challenge_method=S256&response_mode=query

我的 IdentityServer 中是否有一些缺失或错误的配置?

        //
        // IdentityServerBuilder
        //
        identityServerBuilder = services.AddIdentityServer();

        // this adds the operational data from DB (codes, tokens, consents)
        identityServerBuilder.AddOperationalStore(options =>
        {
            options.ConfigureDbContext = builder =>
                builder.UseSqlServer(connectionString,
                    sql => sql.MigrationsAssembly(migrationsAssembly));

            // this enables automatic token cleanup. this is optional.
            options.EnableTokenCleanup = true;
            options.TokenCleanupInterval = 30;
        });


        identityServerBuilder.AddInMemoryIdentityResources(identityServerService.GetIdentityResources())
            .AddInMemoryApiScopes(identityServerService.GetApiScopes())
            .AddInMemoryApiResources(identityServerService.GetApiResources())
            .AddInMemoryClients(identityServerService.GetClients());


        identityServerBuilder.AddTestUsers(identityServerService.GetUsers().ToTestUsers().ToList());

        identityServerBuilder.AddDeveloperSigningCredential();

        //
        // AuthenticationBuilder
        //
        var cookieScheme = identityServerConfig.GetCookieSchemeOrDefault();

        if (identityServerConfig.IsCookieSchemeCustom())
        {
            authenticationBuilder = services.AddAuthentication(cookieScheme).AddCookie(cookieScheme, options =>
            {
                options.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None;
                options.Cookie.SecurePolicy = Microsoft.AspNetCore.Http.CookieSecurePolicy.Always;
            });
        }
        else
        {
            authenticationBuilder = services.AddAuthentication().AddCookie(options =>
            {
                options.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None;
                options.Cookie.SecurePolicy = Microsoft.AspNetCore.Http.CookieSecurePolicy.Always;
            });
        }

标签: asp.net-coreidentityserver4openid-connectoidc-client-js

解决方案


因为您在生产中使用此语句:

AddDeveloperSigningCredential()

这意味着如果您在开发过程中不记得它,将重新创建令牌签名密钥。最佳做法是不要在生产中使用此语句,而是添加更永久的签名密钥,可能在数据库中、Azure Key Vault 或其他可以安全存储它的地方。

第二件事是您还需要配置数据保护 API,并向其传递一个加密密钥,该密钥也保留在您的系统之外。这与签名密钥问题类似。我在这里写了一篇关于它的博客文章。整个部署的加密密钥必须相同,否则用户将在重新部署后退出,因为他们的 cookie 将不再被接受。


推荐阅读