IdentityServer3实施时

时间:2016-05-24 12:24:03

标签: c# identityserver3 .net-4.6

尝试添加自定义DelegatingHandler时,我遇到了一个非常奇怪的情况。调用SendAsync。到目前为止,一切都对生活感到满意。

但是,只要我使用IdentityServer3添加身份验证,我的所有DelegatingHandlers都会被忽略。

SendAsync()

DelegatingHandler

public class LogRequestAndResponseHandler : DelegatingHandler { protected override async Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { // log request body string requestBody = await request.Content.ReadAsStringAsync(); //Trace.WriteLine(requestBody); // let other handlers process the request var result = await base.SendAsync(request, cancellationToken); // once response body is ready, log it var responseBody = await result.Content.ReadAsStringAsync(); //Trace.WriteLine(responseBody); return result; } }

startup.cs

public void Configuration(IAppBuilder app) { app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions { Authority = Globals.TokenAuthenticationAuthority, ValidationMode = ValidationMode.ValidationEndpoint, RequiredScopes = new[] { "scope1", "scope2", "scope3" } }); var config = new HttpConfiguration(); config.MapHttpAttributeRoutes(); config.Filters.Add(new AuthorizeAttribute()); app.UseWebApi(config); }

WebApiConfig

在挖掘和玩耍后,我发现破坏的线是

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        // Configure Web API to use only bearer token authentication.
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
        config.MessageHandlers.Add(new LogRequestAndResponseHandler());

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

但我不明白为什么。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

来自问题的评论链

  

在&#39; WebApiConfig.Register()&#39;

之后调用Configuration()

这就是问题所在。 Configuration()中的Startup.cs方法会创建一个新的HttpConfiguration并将其传递给.UseWebApi()。这有效地撤消了WebApiConfig.Register()所做的一切,因为它向传入的HttpConfiguration添加了过滤器,消息处理程序等。

要解决此问题,您有两种选择:

  1. var config = new HttpConfiguration();中的Startup.cs更改为var config = GlobalConfiguration.Configuration
  2. Startup.Configuration()之前致电WebApiConfig.Register()并确保传递新的HttpConfiguration