IdentityServer 4,试图用提琴手捕获流量?
IdentityServer 4, trying to capture traffic with fiddler?
试图获得发现的控制台应用程序
var disco = await DiscoveryClient.GetAsync("http://localhost:5000");
工作正常,但我试图弄清楚它是如何工作的,但我似乎无法捕获 http 流量。
如果我使用 http://localhost.fiddler 重定向到本地代理错误:
连接到 localhost.fiddler:5000/.well-known/openid-configuration 时出错:需要 HTTPS(未使用 HTTPS 设置,错误信息具有误导性!)
奇怪的是,当我们尝试使用
向 web-api 进行身份验证时,在代码的后面
var response = await client.GetAsync("http://localhost.fiddler:5001/identity");
localhost.fiddler 工作正常,现在这是 运行 在同一个 console.app,在 program.cs 所以同一个文件。这让我很烦,为什么我不能捕获到 5000 的流量,它是 HTTP!那么是什么原因造成的呢?是否有另一种方法来查看进出 Identity Server 的神奇 http 流量?
已添加启动项class
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// configure identity server with in-memory stores, keys, clients and scopes
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
.AddTestUsers(Config.GetUsers());
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseIdentityServer();
}
}
已添加 Blog,如果我们可以解决此问题,将对其进行更新和致谢。
正如您正确理解的那样,您需要使用 http://localhost.fiddler 来通过 fiddler 路由本地主机流量。但是,使用 DiscoveryClient.GetAsync
使用 DiscoveryClient
和默认策略。该默认策略具有以下对这种情况很重要的设置:
- RequireHttps = true
- AllowHttpOnLoopback = true
因此,除非您查询环回地址,否则它需要https。它怎么知道环回地址是什么?有DiscoveryPolicy.LoopbackAddresses
属性。默认包含:
- "localhost"
- "127.0.0.1"
出于这个原因,您有 "HTTPS required" 错误 - "localhost.fiddler" 不被视为环回地址,默认策略要求 non-loopback 地址使用 https。
所以要修复,您需要将 RequireHttps
设置为 false,或者将“localhost.fiddler` 添加到环回地址列表:
var discoClient = new DiscoveryClient("http://localhost.fiddler:5000");
discoClient.Policy.LoopbackAddresses.Add("localhost.fiddler");
//discoClient.Policy.RequireHttps = false;
var disco = await discoClient.GetAsync();
如果你这样做 - 你会在 fiddler 中看到发现请求,但是它会失败(响应将包含错误),因为服务器将报告权限为“http://localhost:5000" and you query "http://localhost.fiddler:5000”。所以你还需要在你的策略中覆盖权限:
var discoClient = new DiscoveryClient("http://localhost.fiddler:5000");
discoClient.Policy.LoopbackAddresses.Add("localhost.fiddler");
discoClient.Policy.Authority = "http://localhost:5000";
var disco = await discoClient.GetAsync();
现在它将按预期工作。
试图获得发现的控制台应用程序
var disco = await DiscoveryClient.GetAsync("http://localhost:5000");
工作正常,但我试图弄清楚它是如何工作的,但我似乎无法捕获 http 流量。
如果我使用 http://localhost.fiddler 重定向到本地代理错误:
连接到 localhost.fiddler:5000/.well-known/openid-configuration 时出错:需要 HTTPS(未使用 HTTPS 设置,错误信息具有误导性!)
奇怪的是,当我们尝试使用
向 web-api 进行身份验证时,在代码的后面var response = await client.GetAsync("http://localhost.fiddler:5001/identity");
localhost.fiddler 工作正常,现在这是 运行 在同一个 console.app,在 program.cs 所以同一个文件。这让我很烦,为什么我不能捕获到 5000 的流量,它是 HTTP!那么是什么原因造成的呢?是否有另一种方法来查看进出 Identity Server 的神奇 http 流量?
已添加启动项class
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// configure identity server with in-memory stores, keys, clients and scopes
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
.AddTestUsers(Config.GetUsers());
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseIdentityServer();
}
}
已添加 Blog,如果我们可以解决此问题,将对其进行更新和致谢。
正如您正确理解的那样,您需要使用 http://localhost.fiddler 来通过 fiddler 路由本地主机流量。但是,使用 DiscoveryClient.GetAsync
使用 DiscoveryClient
和默认策略。该默认策略具有以下对这种情况很重要的设置:
- RequireHttps = true
- AllowHttpOnLoopback = true
因此,除非您查询环回地址,否则它需要https。它怎么知道环回地址是什么?有DiscoveryPolicy.LoopbackAddresses
属性。默认包含:
- "localhost"
- "127.0.0.1"
出于这个原因,您有 "HTTPS required" 错误 - "localhost.fiddler" 不被视为环回地址,默认策略要求 non-loopback 地址使用 https。
所以要修复,您需要将 RequireHttps
设置为 false,或者将“localhost.fiddler` 添加到环回地址列表:
var discoClient = new DiscoveryClient("http://localhost.fiddler:5000");
discoClient.Policy.LoopbackAddresses.Add("localhost.fiddler");
//discoClient.Policy.RequireHttps = false;
var disco = await discoClient.GetAsync();
如果你这样做 - 你会在 fiddler 中看到发现请求,但是它会失败(响应将包含错误),因为服务器将报告权限为“http://localhost:5000" and you query "http://localhost.fiddler:5000”。所以你还需要在你的策略中覆盖权限:
var discoClient = new DiscoveryClient("http://localhost.fiddler:5000");
discoClient.Policy.LoopbackAddresses.Add("localhost.fiddler");
discoClient.Policy.Authority = "http://localhost:5000";
var disco = await discoClient.GetAsync();
现在它将按预期工作。