如何为令牌请求创建拦截中间件?

时间:2017-12-12 19:02:08

标签: oauth asp.net-core asp.net-identity

我试图编写一些ASP.NET Core 2中间件并需要加入身份令牌请求,以便我可以修改响应。这些不是标准的OAuth声明,也不像他们那样行事。相反,我需要在OAuth响应上生成额外的标头。但是,我从正常的请求/响应流程中获得了完全带外的令牌响应,这意味着我的中间件即使它在管道中的第一个也没有机会解雇。

我已经使用IServicesCollection玩了一下,甚至成功地插入了一个服务,首先是""但是,我在我的中间件构造函数中设置的断点在获得令牌响应之前甚至没有触发,我也没有看到任何来自HttpContext的设施。 IServicesCollection。即使提取IStartupFilter并提前致电Configure也不会让我的中间件干预。

如何创建一个先于其他所有中间件(或服务)的中间件(或服务)?

我使用的是IdentityServer4。

编辑:一些代码...

我已尝试过以下两种方法:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMyService(Configuration.GetMyServiceOptions());

    services.AddIdentity<MyUser, MyRole>()
        .AddTokenProvider<DataProtectorTokenProvider<MyUser>>(TokenOptions.DefaultProvider);

    services.AddMvc();

    // after this next line, my token request gets a response
    services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
        .AddIdentityServerAuthentication(options => options.RequireHttpsMetadata = false);

    services.AddIdentityServer()
        .AddDeveloperSigningCredential()
        .AddInMemoryResources(IdentityConfig.GetApiResources())
        .AddInMemoryClients(IdentityConfig.GetApiClients())
        .AddInMemoryIdentityResources(IdentityConfig.GetIdentityResources());
}

AddMyService采取多种形式试图获得正确的注射。在发布之前的最新版本是

public static void AddMyService(this IServiceCollection services, MyServiceOptions options)
{
    var startupFilter = services.BuildServiceProvider().GetRequiredService<IStartupFilter>();

    startupFilter.Configure(builder => builder.UseMyMiddleware(options.ToMiddleware()));
}

我在上面尝试过的其他服务包括IClaimsTransformationITransportFactoryIAuthenticationServiceIHttpContextFactory

.. ..和

public void Configure(IApplicationBuilder app, IHostingEnvrionment env)
{
    // this doesn't get a chance to capture the token request
    app.UseMyMiddleware(Configuration.GetMyMiddlewareOptions());

    app.UseIdentityServer();

    app.UseMvc();
}

通过上述内容,我在app.UseMyMiddleware或我的中间件中的断点之前,在控制台应用程序中得到了对我的令牌请求的响应。

0 个答案:

没有答案