IdentityServer4-如何从另一个ApiResource调用一个ApiResource

时间:2018-07-31 01:13:04

标签: asp.net-core oauth-2.0 access-token identityserver4 openid-connect

我有一个Spa应用程序设置,该设置使用带有OpenId Connect的混合授权流受IdentityServer4保护。

通过

请求access_token,此spa应用程序能够以登录用户身份调用多个ApiResources。
HttpContextAccessor.HttpContext.GetTokenAsync("access_token")

这对于多个ApiResources非常有用。例如,我的Spa应用程序可以调用ApiResource1,ApiResource2和ApiResource3,而不会出现任何问题。

但是,我添加了一个新的ApiResource(即ApiResource4),我需要能够从ApiResource1调用它。但是,当我尝试致电

HttpContextAccessor.HttpContext.GetTokenAsync("access_token")

来自ApiResource1,access_token为null,因此调用失败。

如何使用登录的用户令牌从ApiResource1到ApiResource2进行呼叫?

也许更好的询问方法是,如何从ApiResource1获取登录用户的access_token?

我的SPA应用程序的设置如下:

services.AddAuthentication(options =>
                {
                    options.DefaultScheme = "Cookies";
                    options.DefaultChallengeScheme = "oidc";
                })
                .AddCookie("Cookies", options =>
                {
                    options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
                })
                .AddOpenIdConnect("oidc", options =>
                {
                    options.SignInScheme = "Cookies";

                    options.Authority = Configuration.GetSection("IdentityServerOptions").GetValue<string>("BaseUrl");
                    options.RequireHttpsMetadata = true;

                    options.ClientId = Configuration.GetSection("IdentityServerOptions").GetValue<string>("ClientId");
                    options.ClientSecret = Configuration.GetSection("IdentityServerOptions").GetValue<string>("ClientSecret");

                    options.SaveTokens = true;
                    options.GetClaimsFromUserInfoEndpoint = true;

                    options.Scope.Add("ApiResource1");
                    options.Scope.Add("ApiResource2");
                    options.Scope.Add("ApiResource3");
                    options.Scope.Add("ApiResource4");
                    options.ResponseType = "code id_token";
                });

我的ApiResources设置如下:

services.AddAuthentication("Bearer")
                .AddIdentityServerAuthentication(options =>
                {
                    options.Authority = Configuration.GetSection("IdentityServer").GetValue<string>("BaseUrl");
                    options.RequireHttpsMetadata = true;
                    options.ApiName = _AppName;
                });

1 个答案:

答案 0 :(得分:1)

HttpContext.GetTokenAsync("access_token")扩展方法仅适用于Cookie身份验证。它将尝试提取存储在cookie中的令牌。当您具有使用JWT身份验证的API时,此功能不可用。

您有两个选择。

    如Identity Server文档http://docs.identityserver.io/en/release/topics/extension_grants.html#example-simple-delegation-using-an-extension-grant中所述,
  1. 使用扩展授予委托。此选项实施起来较为复杂,但提供了更高的安全性。

  2. Authorization标头中提取并转发JWT 。此选项很简单,例如在发出API请求之前从请求中获取标头并将其设置在HttpClient的标头上。