从身份服务器获取 access_token 返回 null
Posted
技术标签:
【中文标题】从身份服务器获取 access_token 返回 null【英文标题】:Getting access_token from identityserver returns null 【发布时间】:2018-07-22 17:19:18 【问题描述】:我有 3 个项目,一个 MVC .net 核心网站、一个 API 服务和一个 IdentityServer (IdentityServer4)。登录网站就像一个魅力。当我想从 API 获取数据时,问题就开始了。从 httpcontext 获取 access_token 失败并返回 null。奇怪的是,当我调试它时,我似乎从 httpcontext 中得到了一个 access_token。只有当我从实时网络服务器运行网站时才会出现问题。
我将我的 OpenIdConnect 配置如下:
services.AddAuthentication(options =>
options.DefaultScheme = "Cookies";
options.DefaultAuthenticateScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
)
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
options.SignInScheme = "Cookies";
options.Authority = "https://idserverurl";
options.RequireHttpsMetadata = true;
options.ClientId = "clientid";
options.ClientSecret = "xxxxxxxx";
options.ResponseType = "code id_token";
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("offline_access");
;
);
要为 API 调用设置承载令牌,我使用以下代码:
var client = new HttpClient();
var accessToken = await HttpContext.GetTokenAsync("access_token");
client.SetBearerToken(accessToken);
当我在调试中运行此代码时,我会从 HttpContext 获取 access_token。当我从实时服务器运行它时,我得到空值。
有人知道我做错了什么吗?会不会是服务器级别的配置错误?
【问题讨论】:
你能告诉我们services.AddIdentityServer()
行吗?
【参考方案1】:
我想我自己解决了。 跟线路有关
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
通过删除此行并更改我获得声明的代码行(他们现在有不同的密钥),我得到了 access_token。
仅供参考,我将项目发布到我自己的 IIS。这样我就可以将 Visual Studio 附加到 dotnet 进程并对其进行调试。
为什么它在本地工作而不是在线我仍然不知道。
【讨论】:
我希望有更多关于“更改代码行”的信息...【参考方案2】:上面的代码看起来没问题 - 最终令牌应该在用户登录后从授权服务器返回,然后在身份验证 cookie 中的请求之间持久化。
您是否能够在您的实时 Web 服务器上运行 Fiddler 并捕获流量跟踪,包括您的 Web 应用程序和授权服务器之间的流量?这是排除故障的理想方法 - 并查看 HTTPS 请求中是否存在预期的令牌/cookie。
如果您不知道,在 .Net Core 2.0 中,您可以使用 HttpClientHandler 构建您的 Web 应用程序的 HttpClient,该 HttpClientHandler 设置如下代理详细信息:
public class ProxyHttpHandler : HttpClientHandler
public ProxyHttpHandler()
this.Proxy = new WebProxy("http://127.0.0.1:8888");
在旧版本的 MS OpenIdConnect 库中,我发现了与负载平衡相关的问题,并非所有服务器都可以解密身份验证 cookie。因此,如果您的实时服务器负载平衡,this older link 中的详细信息可能是相关的。
【讨论】:
以上是关于从身份服务器获取 access_token 返回 null的主要内容,如果未能解决你的问题,请参考以下文章
如何在 NextJS s-s-r 中存储和获取 access_token
NodeJS上的Facebook iOS access_token身份验证