2016-11-23 81 views
0

我寫一個.net核心中間件的查詢字符串參數進行加密,在這裏我想用戶看到類似 ?ENC = VXzal017xHwKKPolDWQJoLACDqQ0fE // wGkgvRTdG/GgXIBDd1 而代碼認爲這 ?用戶= 123 &帳戶= 456。中間件加密查詢字符串

我使用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」查詢參數時,當它被解密並且路徑看起來不錯時,if部分中的任何內容都不會執行。我期待它去控制器驗證用戶/通行證。

請跟我來,這是我的第一個中間件,我試圖用我的遺留代碼取代httphandlers。

任何幫助表示讚賞。我已經花了近5個小時的時間,並且似乎無法解決這個問題。

+0

與你的問題沒有關係,但你想通過加密查詢字符串來解決什麼問題? – CodeCaster

+0

我們可能必須在查詢字符串中傳遞客戶端特定的密鑰以及客戶端ID,並且不希望這些密鑰以純文本形式進入。 – 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

您可以查看IQueryFeatureIResponseFeature。在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 
}