我有一个Web应用程序,它使用隐式客户端向Identity Server 4验证用户身份。我需要此用户的访问令牌,以便我可以调用另一个API。
要明确:
Web应用程序针对身份服务器对用户进行身份验证。一旦对它们进行了身份验证,我们就会使用承载令牌来访问API。
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddAuthentication(options =>
{
options.DefaultScheme = "cookie";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("cookie")
.AddOpenIdConnect("oidc", options =>
{
options.Authority = Configuration["ServiceSettings:IdentityServerEndpoint"];
options.ClientId = "f91ece52-81cf-4b7b-a296-26356f50841f";
options.SignInScheme = "cookie";
});
用户验证正常,我可以访问下面的控制器。我需要为此用户提供访问令牌,以便我可以向另一个API发出请求。
[Authorize]
public async Task<IActionResult> Index(int clientId, string error)
{
ViewData["Title"] = "Secrets";
if (User.Identity.IsAuthenticated)
{
// All of the below attempts result in either null or empty array
var attempt1 = Request.Headers["Authorization"];
var attempt2 = await HttpContext.GetTokenAsync("access_token");
var attempt3 = _httpContextAccessor.HttpContext.Request.Headers["Authorization"];
var attempt4 = await _httpContextAccessor.HttpContext.GetTokenAsync("access_token");
}
return View();
}
以下内容包含名为cookie的标头。有没有办法从中获取访问令牌?
var h = _httpContextAccessor.HttpContext.Request.Headers.ToList();
如何为当前经过身份验证的用户找到访问令牌?使用隐式登录。
关于混合与隐式登录的注意事项:由于此处发布的问题,我无法使用混合登录Authentication limit extensive header size由于我无法找到该问题的解决方案,建议切换到隐式登录而不是混合。隐含似乎并没有创造出杂交所做的巨型烹饪。
我一直在关注这个以创建隐式客户端Getting started with Identityserver 4
答案 0 :(得分:4)
默认情况下,OpenID Connect中间件only requests an identity token(response_type
的{{1}})。
您需要先使用以下内容更新id_token
:
OpenIdConnectOptions
然后,您可以使用以下方法将令牌保存到您的Cookie中
options.ResponseType = "id_token token";
最后,您可以使用以下方式访问令牌:
options.SaveTokens = true;
请注意,在使用隐式流时,您还需要在IdentityServer客户端配置中设置await HttpContext.GetTokenAsync("access_token");
标志。
答案 1 :(得分:1)
使用options.SaveTokens = true 然后从声明中获取访问令牌或使用HttpContext.GetTokenAsync 这是博客帖子的链接,例如:https://www.jerriepelser.com/blog/accessing-tokens-aspnet-core-2/