我有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。
有人知道我做错了什么吗?可能是服务器级别的配置错误?
答案 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进程并进行调试。
为什么它在本地运行而不是在线我仍然不知道。