首页 > 解决方案 > 从 http 上下文获取访问令牌

问题描述

我正在使用 IdentityServer4 对我的应用程序和 Web api 进行身份验证。我的客户端应用程序 (vuejs) 实现了隐式授权类型。

在我的 WEB API 中,我有这样的设置:

services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
             .AddIdentityServerAuthentication(options => {
                 options.Authority = Configuration.GetSection("AppSettings:BaseUrls:Identity").Value;
                 options.RequireHttpsMetadata = false;
                 options.SaveToken = true;
                 options.ApiName = "myapi";
             });

在我的控制器中,我正在使用:

var accessToken = await HttpContext.GetTokenAsync("access_token");

得到我的令牌。它一直工作到上周我升级到 dotnet core 2.1。

升级后返回null。

旧版:

<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.7" />

新版本:

<PackageReference Include="Microsoft.AspNetCore.All" Version="2.1.1" />

标签: c#asp.net-coreasp.net-core-2.0identityserver4

解决方案


您可以将以下内容添加到您的AddIdentityServerAuthentication部分

options.JwtBearerEvents = new JwtBearerEvents() { OnTokenValidated = async context => { var accessToken = context.SecurityToken as JwtSecurityToken; if (accessToken != null) { ClaimsIdentity identity = context.Principal.Identity as ClaimsIdentity; if (identity != null) { identity.AddClaim(new Claim("access_token", accessToken.RawData)); } } } }

然后您可以使用访问令牌Request.HttpContext.User.FindFirst("access_token").Value


推荐阅读