2016-11-23 8 views
0

Я пишу .Net Core, Middleware для шифрования параметров строки запроса, где я хочу, чтобы пользователь, чтобы увидеть что-то вроде ? Прил = VXzal017xHwKKPolDWQJoLACDqQ0fE // wGkgvRTdG/GgXIBDd1 в то время как код видит этот ? пользователь = 123 & аккаунт = 456.Middleware зашифровать строку запроса

Я шифрую параметры с помощью IDataProtector. Invoke() в моем промежуточного слоя выглядит код ниже

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); 
     } 

В первый раз, когда я войти в систему и введите имя пользователя/пасс, код приходит к ELSEIF разделе выше, и получает в зашифрованном виде штрафа. Я смотрю на «ENC» запрос паров в следующий раз, и в то время как он получает расшифрован и путь выглядит хорошо,

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

в разделе, если ничего не делает. Я ожидаю, что он перейдет к контроллеру, чтобы проверить пользователя/пароль.

Не стесняйтесь, пожалуйста, это мое первое промежуточное ПО, и я пытаюсь заменить httphandlers в моем устаревшем коде.

Любая помощь приветствуется. Я потратил почти 5 часов на это и, похоже, не понял его.

+0

Не имеет отношения к вашему вопросу, но какую проблему вы пытаетесь решить, зашифровав строку запроса? – CodeCaster

+0

Возможно, нам придется передать секретный ключ для клиента в строке запроса, а также идентификатор клиента и не хотите, чтобы это происходило как обычный текст. – Vish

ответ

0

Я изменил код на.

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); 
      } 

и он действительно работает. Я все еще думаю, что здесь что-то не хватает. Есть лучший способ сделать это ?

1

Вы можете взглянуть на IQueryFeature и IResponseFeature. В ASP.NET Core функции позволяют переопределить поведение объектов основных объектов как HttpRequest & Объект HttpResponse.

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

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

Таким образом, все посредники, выполняющие после вас, будут использовать «Прозрачную функцию».

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 
} 
Смежные вопросы