我有一个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;
});
答案 0 :(得分:1)
HttpContext.GetTokenAsync("access_token")
扩展方法仅适用于Cookie身份验证。它将尝试提取存储在cookie中的令牌。当您具有使用JWT身份验证的API时,此功能不可用。
您有两个选择。
使用扩展授予委托。此选项实施起来较为复杂,但提供了更高的安全性。
从Authorization
标头中提取并转发JWT 。此选项很简单,例如在发出API请求之前从请求中获取标头并将其设置在HttpClient
的标头上。