【问题标题】:IdentityServer 4, trying to capture traffic with fiddler?IdentityServer 4,试图用提琴手捕获流量?
【发布时间】:2018-08-08 22:50:12
【问题描述】:

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

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,如果我们能解决这个问题,我们会更新并感谢。

【问题讨论】:

  • http://localhost.fiddler:5000 首先呢?
  • 不工作不获取api
  • 这到底是什么意思?它抛出异常?还是别的什么?
  • @saj 您的 IdentityServer 实现是否有登录屏幕?如果是这样,解决方案通常使用 MVC。
  • @aaronR,我的坏啊!发布了指向 API 而不是 Id 服务器的链接,现在应该是正确的链接 github.com/IdentityServer/IdentityServer4.Samples/blob/release/…

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


【解决方案1】:

正如您正确计算的那样,您需要使用例如http://localhost.fiddler 来通过提琴手路由本地主机流量。但是,使用 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 中看到发现请求,但它会失败(响应将包含错误),因为服务器会将权限报告为“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”
  • @saj 你确定你在回答中遵循了代码吗?您需要替换 'var disco = await DiscoveryClient.GetAsync("localhost:5000");'带有来自答案的代码。您的错误消息表明您正在尝试对“迪斯科”变量调用策略,但这是不正确的。
  • @saj plus,我测试了发布的解决方案并且非常确定它有效。
  • 我不怀疑你,你说的很有道理,你使用的哪个例子一定缺少参考?
  • 好吧,我通过评论中的最后一个链接下载了示例项目,并按照答案中的描述编辑了客户端。也许您可以添加对您产生错误的确切行?
猜你喜欢
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多