从identityserver获取access_token返回null

时间:2018-02-12 13:55:06

标签: asp.net-core-mvc access-token identityserver4 openid-connect

我有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 :(得分:0)

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

您是否能够在实时网络服务器上运行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中的详细信息可能会相关。

答案 1 :(得分:0)

我想我自己解决了。 它与行

有关
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

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

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

为什么它在本地运行而不是在线我​​仍然不知道。