2016-06-13 3 views
8

У нас есть приложение ASP.NET Web Api, которое использует аутентификацию маркера OAuth для аутентификации, для которого мы пытаемся внедрить ведение журнала Request/Response.Как регистрировать запросы токена аутентификации в веб-интерфейсе ASP.NET

В основном это работает так:
1. Пользователь отправляет запрос на «/ аутентификации» и получает аутентификацию токенов затем
2. Пользователь использует этот маркер проверки подлинности запросов на открытых методов API

Для протоколирования запросы к открытым API-методам, мы используем DelegatingHandler, который отлично работает.

Однако запросы, сделанные для «/ authenticate», не выполняются с помощью реализации DelegatingHandler.

Существует ли другой подход для регистрации запросов на токены?

public abstract class MessageHandler : DelegatingHandler 
{ 
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     var correlationId = Guid.NewGuid(); 

     var requestInfo = string.Format("{0} {1}", request.Method, request.RequestUri); 

     var requestContent = await request.Content.ReadAsByteArrayAsync(); 

     var context = ((HttpContextBase)request.Properties["MS_HttpContext"]); 

     await IncomingMessageAsync(correlationId, request.Method, request.RequestUri, request.Headers, requestContent, 
      context.Request.UserHostAddress, context.Request.IsAuthenticated, context.User.Identity.Name); 

     var response = await base.SendAsync(request, cancellationToken); 

     byte[] responseMessage; 

     responseMessage = await response.Content.ReadAsByteArrayAsync(); 

     await OutgoingMessageAsync(correlationId, response.StatusCode, response.Headers, responseMessage); 

     return response; 
    } 

    protected abstract Task IncomingMessageAsync(Guid correlationId, HttpMethod requestMethod, Uri requestUri, HttpRequestHeaders requestHeaders, byte[] messageContent, string ipAddress, bool isAuthenticated, string requestMadeByUserName); 
    protected abstract Task OutgoingMessageAsync(Guid correlationId, HttpStatusCode statusCode, HttpResponseHeaders responseHeaders, byte[] messageContent); 
} 

EDIT ж/OAuth Код

[assembly: OwinStartup(typeof(MyApp.Infrastructure.IdentityConfig))] 
namespace MyApp.Infrastructure 
{ 
    public class IdentityConfig 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      app.CreatePerOwinContext<ApplicationIdentityDbContext>(() => ApplicationIdentityDbContext.Create(ConfigurationDataProvider.MYDBCONNSTRING)); 
      app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 
      app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create); 

      app.UseOAuthBearerTokens(new OAuthAuthorizationServerOptions 
      { 
       Provider = new ApplicationAuthProvider(), 
       AllowInsecureHttp = true, 
       TokenEndpointPath = new PathString("/Authenticate") 
      }); 
     } 
    } 
} 
+0

Возможно, вы можете использовать [OnResponseSignIn] (https://msdn.microsoft.com/en-us/library/microsoft.owin.security.cookies.cookieauthenticationprovider.onresponsesignin (v = vs.113) .aspx)? – DavidG

+0

Спасибо за предложение Дэвида. Я не уверен, что это будет работать, поскольку мы используем OAuthBearerTokens вместо файлов cookie. – thiag0

+0

Каким будет ваше промежуточное ПО OAuth, вы можете показать этот код? – DavidG

ответ

2

Вы устанавливаете OWIN middleware выдавать жетоны перед тем WebAPI промежуточного программного обеспечения.

app.UseOAuthBearerTokens(new OAuthAuthorizationServerOptions 
    { 
     Provider = new ApplicationAuthProvider(), 
     AllowInsecureHttp = true, 
     TokenEndpointPath = new PathString("/Authenticate") 
    }); 

DelegatingHandler вы пытаетесь использовать, чтобы войти запрос является частью Web API middeware и никогда не достигается, так как маркер выдающий промежуточного слоя обрабатывает запрос и не требует промежуточного программного далее в трубопровод.

Вместо использования DelegatingHandler используйте следующее промежуточное программное обеспечение и установите его перед промежуточным программным обеспечением токена.

public class RequestLoggerMiddleware 
{ 
    private readonly Func<IDictionary<string, object>, Task> _next; 
    private readonly ILogger _logger; 

    public RequestLoggerMiddleware(
     Func<IDictionary<string, object>, Task> next, 
     ILogger logger) 
    { 
     _next = next; 
     _logger = logger; 
    } 

    public Task Invoke(IDictionary<string, object> environment) 
    { 
     var context = new OwinContext(environment); 

     _logger.Write($"{context.Request.Method} {context.Request.Uri.AbsoluteUri}"); 
     var result = _next.Invoke(environment); 
     _logger.Write($"Status code: {context.Response.StatusCode}"); 

     return result; 
    } 
} 

Чтобы установить промежуточное программное обеспечение, просто вставить заявление: app.Use(typeof (RequestLoggerMiddleware)); перед app.UseOAuthBearerTokens заявлением в вашем Startup.cs.

+0

Имеет смысл. Можете ли вы указать мне ресурс, показывающий, как регистрировать «RequestLoggerMiddleware» перед компонентом промежуточного программного обеспечения OAuth? – thiag0

+0

@ thiag0 Просто вставьте инструкцию: 'app.Use (typeof (RequestLoggerMiddleware));' перед оператором 'app.UseOAuthBearerTokens'. – MvdD

+0

При использовании этого подхода, каков надлежащий способ чтения содержимого запроса и ждать ответа на обработку, чтобы он мог быть зарегистрирован? – thiag0

Смежные вопросы