IdentityServer 4,试图用fiddler捕获流量?

时间:2018-02-28 22:56:54

标签: c# asp.net-web-api fiddler identityserver4 oidc

试图获取发现的控制台应用程序

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流量?

添加了启动类

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,如果我们可以解决此问题,我们会更新并提供信用。

1 个答案:

答案 0 :(得分:4)

正如您所知,您需要使用http://localhost.fiddler来通过fiddler路由localhost流量。但是,使用DiscoveryClient.GetAsync使用DiscoveryClient默认策略。对于这种情况,该默认策略具有以下重要设置:

  • RequireHttps = true
  • AllowHttpOnLoopback = true

因此,除非您查询环回地址,否则它需要https。怎么知道什么是环回地址?有DiscoveryPolicy.LoopbackAddresses属性。默认情况下,它包含:

  • "本地主机"
  • " 127.0.0.1"

出于这个原因,你需要" HTTPS需要"错误 - " localhost.fiddler"不被视为环回地址,默认策略要求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中看到disovery请求,但它会失败(响应将包含错误),因为服务器会将权限报告为" http://localhost:5000"并且您查询" 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();

现在它将按预期工作。