2016-11-23 5 views
0

Ich bin eine .NET-Core-Middleware Schreiben der Abfrage-String-Parameter zu verschlüsseln, wo ich Benutzer mag so etwas wie ? Enc = VXzal017xHwKKPolDWQJoLACDqQ0fE // wGkgvRTdG/GgXIBDd1 zu sehen, während der Code diesen sieht? user = 123 & account = 456.Middleware verschlüsseln Abfragestring

Ich verschlüssele die Parameter mit einem IDataProtector. Die Invoke() in meiner Middleware sieht aus wie der Code unten

if (UriHelper.GetEncodedUrl(context.Request).Contains("?")) 
     { 
      string query = ExtractQuery((context.Request.GetEncodedUrl())); 

      int indexOfEnc = query.IndexOf(PARAMETER_NAME, StringComparison.OrdinalIgnoreCase); 

      if (indexOfEnc > -1) 
      { 

       var enc = context.Request.Query[PARAMETER_NAME]; 
       enc = Decrypt(enc); 
       context.Request.Path = new PathString(context.Request.Path.Value + enc); 
       await _next.Invoke(context); 
      } 

      else if (context.Request.Method == "GET" || context.Request.Method == "POST") 
      { 
       // Encrypt the query string and redirects to the encrypted URL. 
       // Remove if you don't want all query strings to be encrypted automatically. 
       string encryptedQuery = Encrypt(query); 
       string tempRawUrl = UriHelper.GetEncodedUrl(context.Request).ToLower(); 
       if (!(context.Request.Method == "POST" && tempRawUrl.Contains("ha"))) 
       { 
        context.Response.Redirect(context.Request.Path.Value + "?" + PARAMETER_NAME + "=" + encryptedQuery); 
       } 
      } 

     } 
     else 
     { 
      await _next.Invoke(context); 
     } 

das erste Mal, wenn ich den Benutzer anmelden, und gibt Sie/pass, den Code kommt in den elseif Abschnitt oben und wird verschlüsselt in Ordnung. Ich suche nach der „enc“ Abfrage param das nächste Mal und während es wird entschlüsselt und der Weg sieht gut aus, die

**await _next.Invoke(context);** 

im Abschnitt, wenn tut nichts. Ich erwarte, dass es an den Controller geht, um den Benutzer/Ausweis zu validieren.

Bear mit mir bitte, das ist meine erste Middleware und ich versuche, die httphandlers in meinem Legacy-Code zu ersetzen.

Jede Hilfe wird geschätzt. Ich habe fast 5 Stunden damit verbracht und kann es anscheinend nicht herausfinden.

+0

Nicht verwandt mit Ihrer Frage, aber welches Problem versuchen Sie zu lösen, indem Sie die Abfragezeichenfolge verschlüsseln? – CodeCaster

+0

Möglicherweise müssen wir einen clientspezifischen geheimen Schlüssel in der Abfragezeichenfolge sowie eine Client-ID übergeben und möchten nicht, dass dies als reiner Text erfolgt. – Vish

Antwort

0

Ich habe den Code geändert.

if (indexOfEnc > -1) 
      { 

       var enc = context.Request.Query[PARAMETER_NAME]; 
       enc = "?" + Decrypt(enc); 
       Microsoft.AspNetCore.Http.QueryString queryString = new Microsoft.AspNetCore.Http.QueryString(enc); 
        context.Request.QueryString = queryString; 

       await _next.Invoke(context); 
      } 

und es funktioniert jetzt. Ich denke immer noch, dass ich hier etwas verpasse. Gibt es einen besseren Weg, dies zu tun?

1

Sie können sich die IQueryFeature und die IResponseFeature ansehen. In ASP.NET Core können Features das Verhalten von Basisobjekten wie HttpRequest & HttpResponse-Objekt überschreiben.

Sie könnten einfach die vorhandenen IQueryFeature für transparente Entschlüsselung umhüllen. Und für die Abfrageverschlüsselung, wickeln Sie die vorhandene IResponseFeature für transparente Verschlüsselung. Legen Sie die Wrapper innerhalb der Middleware fest.

httpContext.Features.Set<IQueryFeature>(new TransparentDecryptionQueryFeature(httpContext.Features.Get<IQueryFeature>)); 
httpContext.Features.Set<IResponseFeature>(new TransparentEncryptionResponseFeature(httpContext.Features.Get<IResponseFeature>)); 

Alle Middlewares, die nach Ihrer Ausführung ausgeführt werden, verwenden die "Transparente Funktion".

public class TransparentDecryptionQueryFeature : IQueryFeature 
{ 
    privare readonly IQueryCollection _store; 

    public TransparentDecryptionQueryFeature(IQueryFeature feature) 
    { 
     _store = new TranparentDecryptionQueryCollection(feature.Query); 
    } 

    public IQueryCollection Query 
    { 
     get 
     { 
      return _store; 
     } 

     set 
     { 
      _store = new TransparentDecryptionQueryCollection(value); 
     } 
    } 
} 

public class TransparentDecryptionQueryCollection : IQueryCollection 
{ 
    private readonly IQueryCollection _inner; 

    public TransparentDecryptionQueryCollection(IQueryCollection inner) 
    { 
     var store = new Dictionary<string, StringValues>() 
     foreach (var item in inner) 
     { 
      if (item.Key == PARAMETER_NAME) 
      { 
       // TODO : Adds all the decrypted query parameters in the store 
      } 
      else 
      { 
       store.Add(item); 
      } 
     } 
     _inner = new QueryCollection(store); 
    } 

    // implement other methods by delegating with _inner object 
}