代码之家  ›  专栏  ›  技术社区  ›  user3357099

从identityserver获取access\u令牌返回null

  •  2
  • user3357099  · 技术社区  · 7 年前

    我有3个项目,一个MVC。net核心网站、API服务和IdentityServer(IdentityServer 4)。登录这个网站就像一种魅力。当我想从API获取数据时,问题就开始了。从httpcontext获取access\u令牌失败并返回null。奇怪的是,当我调试这个时,我似乎从httpcontext获得了一个access\u令牌。只有当我从live Web服务器运行网站时,它才会导致问题。

    我将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调用设置BealerToken,我使用以下代码:

       var client = new HttpClient();
       var accessToken = await HttpContext.GetTokenAsync("access_token");
       client.SetBearerToken(accessToken);
    

    当我在debug中运行此代码时,我从HttpContext获取access\u令牌。当我从实时服务器运行这个时,我得到null。

    有人知道我做错了什么吗?这可能是服务器级别的配置错误吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   user3357099    7 年前

    我想我自己解决了。 这和线路有关

    JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
    

    通过删除这一行并更改获取声明的代码行(现在它们有不同的密钥),我获得了access\u令牌。

    仅供参考,我已将项目发布到自己的IIS。这样我就可以将Visual Studio连接到dotnet进程并进行调试。

    我仍然不知道为什么它在本地有效,而不是在线。

        2
  •  0
  •   Gary Archer    7 年前

    上面的代码看起来不错-最终,令牌应该在用户登录后从授权服务器返回,然后在身份验证cookie中的请求之间持久化。

    您是否能够在live 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 可能相关。