2014-01-23 2 views
1

나는 몇 가지 추가 메서드를 사용하여 동일한 인터페이스를 사용하는 내 MVC 응용 프로그램에서 Cookie 개체/메서드를 대체하여 만들려고합니다.MVC5에서 HttpCookie 개체를 어떻게 확장 할 수 있습니까?

내가 추가하려는 방법은 암호화 된 쿠키를 만드는 사용자 지정 방법입니다. 이 방법은 기본적으로 쿠키를 설정하기 전에 쿠키에 설정된 데이터를 암호화합니다. 역 방법은 쿠키를 읽은 후 데이터를 해독합니다.

쿠키 개체를 기본 개체로 바꾸려면 기본 메서드가 자동 암호화/암호 해독을 수행하는 방식을 다시 고안 할 수 있어야합니다.

+0

당신은 할 수 기존의 Cookie 클래스에서 확장 메소드를 사용해보십시오. –

+0

이것이 웹 API에 존재한다는 것을 알고 있습니다. 아마도 MVC에 맞게 조정할 수 있습니까? http://www.asp.net/web-api/overview/working-with-http/http-cookies –

답변

1

HttpCookie 클래스는 봉인되어 있으며 상속받을 수 없지만 사용하기 쉬운 연산자 오버로드로 암호화 된 쿠키 클래스를 작성하면 쉽게 상속받을 수 있습니다.

public class EncryptedCookie 
{ 
    public string Name { get; set; } 

    public string Value { get; set; } 

    private byte[] encryptionKey; 

    private byte[] hmacKey; 

    public EncryptedCookie() 
    { 
     // setup keys 
     encryptionKey = Convert.FromBase64String(ConfigurationManager.AppSettings["encryption-key"]); 
     this.hmacKey = Convert.FromBase64String(ConfigurationManager.AppSettings["hmac-key"]); 
    } 

    public static explicit operator HttpCookie(EncryptedCookie cookie) 
    { 
     if (string.IsNullOrEmpty(cookie.Name)) 
     { 
      throw new ArgumentException("Encrypted cookie must have a name"); 
     } 

     if (string.IsNullOrEmpty(cookie.Value)) 
     { 
      throw new ArgumentException("Encrypted cookie must have a value"); 
     } 

     return new HttpCookie(cookie.Name, cookie.Encrypt()); 
    } 

    public static explicit operator EncryptedCookie(HttpCookie cookie) 
    { 
     if (cookie == null) 
     { 
      return null; 
     } 

     var result = new EncryptedCookie { Name = cookie.Name }; 
     result.Decrypt(cookie.Value); 
     return result; 
    } 

    private string Encrypt() 
    { 
     var encryptor = new Encryptor<AesEngine, Sha256Digest>(Encoding.UTF8, this.encryptionKey, this.hmacKey); 
     return encryptor.Encrypt(this.Value); 
    } 

    private void Decrypt(string cookieValue) 
    { 
     var encryptor = new Encryptor<AesEngine, Sha256Digest>(Encoding.UTF8, this.encryptionKey, this.hmacKey); 
     string plainText = encryptor.Decrypt(cookieValue); 
     if (string.IsNullOrEmpty(plainText)) 
     { 
      throw new ArgumentException(); 
     } 

     this.Value = plainText; 
    } 
} 

이 클래스를 사용하려면 내 암호기 클래스와 bouncycastle이 필요합니다. 이 클래스는 사용자가 입력 한 값의 암호화를 수행하고 이미 응답에있는 http 쿠키에서 설정할 때 암호 해독을 수행합니다. HMAC는 쿠키 값을 변경하지 않았 음을 확인하기 위해 자동으로 IV를 생성합니다. 두 개의 별도 키가 필요합니다. 하나는 HMAC 용이고 다른 하나는 암호화 용입니다. 암호화 시스템에서 가장 중요한 부분이므로 현명하게 생성하십시오.

encryptor 클래스는 Encrypt and decrypt a string에서 찾을 수 있습니다. 또는 회사에서 특별히 사용하는 것이 있으면 무엇이든 사용할 수 있습니다. 마지막으로

단순히 사용하는 암호화 된 쿠키를 만들어 응답에 추가 :

EncryptedCookie cookie = new EncryptedCookie { Name = "MyCookie", Value = "Hide this!" }; 
Response.Cookies.Add((HttpCookie)cookie); 

당신은 단순히 암호화 된 쿠키로 다시 쿠키를 캐스팅 해독 할 :

var cookie = (EncryptedCookie)Request.Cookies["MyCookie"]; 
Response.Write(cookie.Value); 
+0

이것은 내가 목표로했던 것에 매우 가깝습니다. 누락 된 유일한 비트는 암호화 된 쿠키인지 여부를 자동으로 결정하고 해독을 자동으로 수행하는 방법입니다. – Hades

+0

암호화되지 않은 쿠키가 포함 된 쿠키 컬렉션에 혼합되므로이 작업을 수행 할 수 없습니다. 기술적으로 isencrypted 속성을 넣은 다음 모든 쿠키를 암호화 된 쿠키에 캐스트 할 수는 있지만 불필요한 오버 헤드와 피할 수없는 추가 코드를 가져올 수 있습니다. – nerdybeardo

+0

HTTP 처리기 수준에서 수행 할 수 있습니까? 예를 들어, 암호화하려는 모든 쿠키에서 쿠키 이름에 문자열 접두사를 설정하기 만하면됩니다. 그 후 핸들러가 붙은 모든 쿠키는 요청/응답 파이프 라인을 통해 자동으로 암호화/해독 할 수 있습니다. 말이 돼? 내 프로젝트의 개발자가 너무 많이 생각할 필요가 없도록하는 방법을 찾고 있습니다. – Hades

0

나는 방법이 있다고 생각하지 않습니다. Cookie 인스턴스를 노출하는 HttpRequest/HttpResponse 객체는 모두 HttpCookie 클래스 자체로서 봉인되어 있습니다.

HttpResponseWrapper/HttpRequestWrapper 기본 클래스를 사용하여 요청/응답을 다시 구현하면 문제를 해결할 수 있지만 많은 작업이 필요할 수 있습니다.

행운을 빈다.

+0

응답 해 주셔서 감사합니다. 위의 nerdybeardo의 대답은 내가 찾고있는 것에 더 가깝습니다 ... 자세한 내용은 여기에 주석을보십시오 :) – Hades

관련 문제