C# 用户已通过身份验证,但访问令牌在哪里?

C# 用户已通过身份验证,但访问令牌在哪里?,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) {

我有一个web应用程序,它使用隐式客户端向Identity Server 4验证用户。我需要该用户的访问令牌,以便调用另一个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();
    }
要明确的是:

  • 我有一个身份服务器。使用Identity server 4创建
  • 我在Asp.net核心mvc中创建了有问题的web应用程序
  • 在.NETCore中创建的API
  • Web应用程序根据identity server对用户进行身份验证。一旦它们通过身份验证,我们就使用承载令牌访问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";
                });
    
    如何为当前经过身份验证的用户找到访问令牌?使用隐式登录

    关于混合登录与隐式登录的注意事项:由于此处发布的问题,我无法使用混合登录,因为我无法找到该问题的解决方案。建议切换到隐式登录,而不是混合登录。隐式烹饪似乎并没有创造出混合型烹饪的巨人


    我一直遵循这一点来创建隐式客户端

    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");