在应用之间看到相同的访问令牌

时间:2019-02-27 21:52:17

标签: c# reactjs identityserver4

我有一个身份服务器(IS)的本地实例。我有一个容器应用程序和一个子应用程序,并且该容器应用程序配置了身份服务器。从容器应用程序(URL链接)启动子应用程序。

启动容器应用程序时,可以按预期登录IS。然后,当我通过链接启动子应用程序时,看到相同的ID令牌和访问令牌正在子应用程序上使用。

我想这是预期的。

但是,如果我将子应用程序配置为具有IS,则我希望该子应用程序有一个新的访问令牌,但相反,我会看到与容器应用程序相同的访问令牌。

这是正确的行为还是应该为子应用提供新的访问令牌?

在我的子应用程序上,我有一个具有以下功能的控制器:

        if (User.Identity.IsAuthenticated)
        {
            accessToken = await HttpContext.GetTokenAsync("access_token");
            idToken = await HttpContext.GetTokenAsync("id_token");

            // Now you can use them. For more info on when and how to use the 
            // access_token and id_token, see https://auth0.com/docs/tokens
        }

控制器具有[Authorize]属性。

Idsrv4配置:

new Client
            {
                ClientId = "react_main_container_app_implicit",
                ClientSecrets = new [] { new Secret("secret".Sha256()) },
                AllowedGrantTypes = GrantTypes.Implicit,
                AllowedScopes = new []
                {
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    "singlespa_access",
                    "employee_info"
                },
                AllowAccessTokensViaBrowser = true,
                RedirectUris = new [] { "http://localhost:63580/signin-oidc" }, //mw knows how to handle this.
                PostLogoutRedirectUris = new []{"http://localhost:63580/signout-callback-oidc"}
            },
            new Client
            {
                ClientId = "react-child_app_implicit",
                ClientSecrets = new [] { new Secret("secret".Sha256()) },
                AllowedGrantTypes = GrantTypes.Implicit,
                // RequireConsent =  true,
                AllowedScopes = new []
                {
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    "singlespa_access"
                },
                AllowAccessTokensViaBrowser = true,
                RedirectUris = new [] { "http://localhost:5001/signin-oidc" }, //mw knows how to handle this.
                PostLogoutRedirectUris = new []{"http://localhost:5001/signout-callback-oidc"}
            }

            services.AddIdentityServer()
            .AddDeveloperSigningCredential(true)
            .AddInMemoryClients(InMemoryConfiguration.Clients())
            .AddInMemoryApiResources(InMemoryConfiguration.ApiResources()) // these are now called scopes. API allowed to use auth server.
            .AddInMemoryIdentityResources(InMemoryConfiguration.IdentityResources())
            .AddTestUsers(InMemoryConfiguration.Users());

1 个答案:

答案 0 :(得分:0)

如果我正确理解这一点,那么您所描述的行为是预期的,并且是由于单点登录作用所致,因为当您使用用户凭据登录到Identity Server 4时,它将离开cookie,然后一旦您的另一个客户端重定向到与身份提供者相同,cookie身份验证方案将启动并自动登录用户并颁发令牌,而无需输入凭据。

但是,如果您的客户端配置了RequireConsent = true,并且您的应用程序使用了不同的client_id,则您仍应进入同意屏幕。