从身份服务器获取 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

oauth2认证后返回#怎么获取accesstoken?

NodeJS上的Facebook iOS access_token身份验证

如何设计API接口,请求接口时需要进行身份验证,防止第三方随意调用接口?

Spring安全问题中的OAuth获取userInfo

关于微信获取access_token接口,返回值为-1000的问题