C# 用户已通过身份验证,但访问令牌在哪里?
我有一个web应用程序,它使用隐式客户端向Identity Server 4验证用户。我需要该用户的访问令牌,以便调用另一个APIC# 用户已通过身份验证,但访问令牌在哪里?,c#,asp.net-core-mvc,identityserver4,C#,Asp.net Core Mvc,Identityserver4,我有一个web应用程序,它使用隐式客户端向Identity Server 4验证用户。我需要该用户的访问令牌,以便调用另一个API [Authorize] public async Task<IActionResult> Index(int clientId, string error) { ViewData["Title"] = "Secrets"; if (User.Identity.IsAuthenticated) {
[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();
}
要明确的是:
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";
});
如何为当前经过身份验证的用户找到访问令牌?使用隐式登录
关于混合登录与隐式登录的注意事项:由于此处发布的问题,我无法使用混合登录,因为我无法找到该问题的解决方案。建议切换到隐式登录,而不是混合登录。隐式烹饪似乎并没有创造出混合型烹饪的巨人
我一直遵循这一点来创建隐式客户端Use options.SaveTokens=true 然后从声明中获取访问令牌或使用HttpContext.GetTokenAsync
下面是到blogpost的链接,示例为:默认情况下,OpenID连接中间件(一种
id\u令牌的response\u type
)
您需要首先使用以下内容更新您的OpenIdConnectOptions
:
options.ResponseType = "id_token token";
然后,您可以使用以下方法将令牌保存到cookie中:
options.SaveTokens = true;
最后,您可以使用以下方式访问令牌:
await HttpContext.GetTokenAsync("access_token");
请注意,在使用隐式流时,您还需要在IdentityServer客户端配置中设置AllowAccessTokensVibaBrowser
标志。它应该是Authorization
而不是Authentication
,这是传递令牌的默认约定。在attempt1中,标头名称不正确;在attempt3中,键入了typo.changed,但没有任何效果_httpContextAccessor.HttpContext.Request.Headers.ToList();不包含授权标头。很可能它已丢失。您已通过第三方提供商的身份验证,现在所需的所有信息都存储在asp.net创建的cookie中,访问令牌不再相关。由于我的身份服务器不是第三方,我需要访问令牌来访问作为承载令牌发送的api。所以不管怎样,要从cookie中获取访问令牌?它是您的,但在这个应用程序的上下文中,它仍然被视为第三方(外部)。我认为访问令牌在cookie中的任何位置或此方案中的任何其他位置都不可用。options.ResponseType=“id\u token token”;不,这仍然是含蓄的:(掌心)我以为添加任何ResponseType都会使它混合!我想我在什么地方读错了。。。。。我明天会尝试一下,谢谢,这是可行的,但是,HttpContext.User并没有包含所有声明。这很奇怪,因为我可以看到上下文。用户是在AddOpenIdConnect事件中设置的。您的标识令牌不再包含标识范围声明。您现在需要使用用户信息端点。在OIDC中间件中有一个这样做的选项
await HttpContext.GetTokenAsync("access_token");