IdentityServer 4,如何使用 Fiddler 捕获流量?

3

控制台应用程序尝试获取发现信息

var disco = await DiscoveryClient.GetAsync("http://localhost:5000");

正常工作,但是我想弄清楚这个东西是如何工作的,我似乎无法捕获http流量。
如果我使用http://localhost.fiddler重定向到本地代理会出错: Error connecting to localhost.fiddler:5000/.well-known/openid-configuration: HTTPS required (it's not setup with HTTPS, the error msg is misleading!) 奇怪的是,在代码后面,当我们尝试通过web-api进行身份验证时,却发生了这种情况。
var response = await client.GetAsync("http://localhost.fiddler:5001/identity");

localhost.fiddler运行良好,现在它在同一个console.app中运行,在program.cs文件中。这让我疯狂,为什么无法捕获到发送到5000端口的流量?这是HTTP协议啊!那么是什么神秘的原因导致这种情况出现?是否还有其他方法来查看发送到Identity Server并返回的 HTTP 流量的魔力?

添加了 Startup 类

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();
    }
}

新增了博客,如果我们能解决这个问题,会更新并标注您的贡献。


首先,http://localhost.fiddler:5000 怎么样? - Tarun Lalwani
无法工作,无法连接到API。 - fuzzybear
我们遇到了这个错误:连接到http://localhost.fiddler:5000/.well-known/openid-configuration时出错:需要HTTPS(它没有设置HTTPS,错误消息略有不准确!!!) - fuzzybear
1
@saj,你的IdentityServer实现有登录界面吗?如果有的话,解决方案通常使用MVC。 - aaronR
1
@aaronR,我的错,我贴了API的链接而不是Id服务器的链接,这应该是正确的链接:https://github.com/IdentityServer/IdentityServer4.Samples/blob/release/Quickstarts/1_ClientCredentials/src/QuickstartIdentityServer/Startup.cs - fuzzybear
显示剩余12条评论
1个回答

4
正如您所猜测的那样,您需要使用例如http://localhost.fiddler来通过fiddler路由本地主机流量。然而,使用DiscoveryClient.GetAsync将默认使用DiscoveryClient策略。该默认策略具有以下对于这种情况很重要的设置:
  • RequireHttps = true
  • AllowHttpOnLoopback = true
因此,它要求使用https,除非您查询回送地址。它如何知道什么是回送地址?这里有一个DiscoveryPolicy.LoopbackAddresses属性。默认情况下,它包含:
  • "localhost"
  • "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中看到发现请求,但它将失败(响应将包含错误),因为服务器将报告权限为“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();

现在它将按预期工作。

嗨,这听起来非常有前途,但我没有看到.Policy...错误“DiscoveryResponse”不包含“Policy”的定义,也没有扩展方法“Policy”。 - fuzzybear
@saj,你确定你按照答案里的代码操作了吗?你需要用答案中的代码替换掉“var disco = await DiscoveryClient.GetAsync("http://localhost:5000");”。你的错误信息表明你试图在“disco”变量上调用Policy,但这是不正确的。 - Evk
@saj 另外,我测试了发布的解决方案,并且非常确定它可以工作。 - Evk
我不怀疑你,你所说的很有道理。你正在处理的示例可能缺少一个引用? - fuzzybear
我通过您在评论中提供的最后一个链接下载了示例项目,并按照答案中所述编辑了客户端。也许您可以添加导致错误的确切行? - Evk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接