首页 文章

从identityserver获取access_token返回null

提问于
浏览
0

我有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调用设置bearertoken,我使用de代码:

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

当我在调试中运行此代码时,我从HttpContext获取access_token . 当我从实时服务器运行它时,我得到null .

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

2 回答

  • 0

    上面的代码看起来没问题 - 最终令牌应该在用户登录后从授权服务器返回,然后在身份验证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库中,我发现了与负载 balancer 相关的问题,并非所有服务器都可以解密身份验证cookie . 因此,如果您的实时服务器负载均衡,this older link中的详细信息可能是相关的 .

  • 0

    我想我自己解决了 . 这与线路有关

    JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
    

    通过删除此行并更改我获得声明的代码行(它们现在有不同的键),我得到access_token .

    仅供我将该项目发布到我自己的IIS . 这样我就可以将Visual Studio附加到dotnet进程并进行调试 .

    为什么它在本地工作而不是在线我仍然不知道 .

相关问题