2016-11-01 3 views
2

내 Asp.Net 코어 1.0 사이트의 설정 AntiForgery 토큰을 다음했듯이 :방지 Fogery 토큰을 해독 할 수 없습니다

services.AddAntiforgery(options => 
     { 
      options.HeaderName = "X-XSRF-Token"; //Angular's default header name for sending the xsrf token 
     }); 

app.Use(next => context => 
     { 
      //2 tokens are generated. A Cookie token, which goes in an ASP cookie called something like .AspNetCore.Antiforgery.****** and a request token. The request token gets passed in the http request 
      //headers back to the server when executing a POST and is validated agains't the cookie token. By taking the request token and putting it in an HTTP-Only cookie called XSRF-TOKEN, Angular will 
      //automatically take the cookie and add it to an X-XSRF-Token header for each request. The request token received in the header is then validated against the cookie token. In ConfigureServices() above, 
      //ASP's antiforgery system is setup to look for the request token in the X-XSRF-Token header. For form posts (i.e. not posts done by Angular), the form has a token associated with it that gets passed in the POST 
      // which is used in place of the header token 
      var tokens = antiforgery.GetAndStoreTokens(context); 
      context.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken, new CookieOptions() { HttpOnly = false }); 

      return next(context); 
     }); 

     app.UseAntiForgeryValidation(); 

public class AntiForgeryValidation 
{ 
    private readonly RequestDelegate _next; 
    IAntiforgery _antiforgery; 
    private ILogger<AntiForgeryValidation> _logger; 

    public AntiForgeryValidation(RequestDelegate next, IAntiforgery antiforgery, ILoggerFactory loggerFactory) 
    { 
     _next = next; 
     _antiforgery = antiforgery; 
     _logger = loggerFactory.CreateLogger<AntiForgeryValidation>(); 
    } 

    public async Task Invoke(HttpContext context) 
    { 
     //don't need to validate anti-forgery tokens for GET 
     if (string.Equals("POST", context.Request.Method, StringComparison.OrdinalIgnoreCase) 
      || string.Equals("PUT", context.Request.Method, StringComparison.OrdinalIgnoreCase) 
      || string.Equals("DELETE", context.Request.Method, StringComparison.OrdinalIgnoreCase)) 
     { 

      await _antiforgery.ValidateRequestAsync(context); 
     } 

     await _next(context); 
    } 
} 

public static partial class MiddlewareExtensionMethods 
{ 
    public static void UseAntiForgeryValidation(this IApplicationBuilder builder) 
    { 
     builder.UseMiddleware<AntiForgeryValidation>(); 
    } 
} 

내 dev 환경에서 및 IIS에 게시 할 때 잘 작동합니다. 로드 밸런서가로드 밸런서에서 제공하는 VIP를 통해 액세스 할 때 내 사이트 앞에로드 밸런서가 있습니다. 다음과 같은 오류로 내 위조 검증이 실패합니다.

{7f02de42-e781-4c27-a2e5-fce932f4b7a4 } 열쇠 고리에서 찾을 수 없습니다. 보호 해제 작업이

처리되지 않은 예외가 application.The 해독 할 수없는 antiforgery 토큰을 던져졌다를 진행할 수 없습니다.

(자세한 로그는 아래 참조).

부하 분산 장치가 있지만 서버 뒤에는 하나의 웹 서버 만 있으므로 요청이 서버간에 분할되지 않아야한다는 점도 지적해야합니다. 누군가가로드 밸런서를 통해 액세스 할 때 왜로드 밸런서를 우회하기 위해 호스트 항목을 통해 직접 액세스 할 때가 아니라면 이것이 발생하는 이유를 알고 있다면 도움이 될 것입니다.

로그인 2016년 11월 1일 15 : 28 : 01.3761 | 22 | TRACE | Microsoft.Extensions.Logging.LoggingExtensions.PerformingUnprotectOperationToKeyWithPurposes | 키에 보호 해제 작업을 수행 {4441518f-1b1d-49a8-b06a-29724cb692ae}와 ('C : \ temp \ wizard', 'Microsoft.AspNetCore.Antiforgery.AntiforgeryToken.v1').2016-11-01 15 : 28 : 01.4074 | 22 | TRACE | Microsoft.Extensions.Logging.LoggingExtensions.PerformingProtectOperationToKeyWithPurposes | 키 (4441518f-1b1d-49a8-b06a-29724cb692ae)에 대한 작업을 'C : \ temp \ wizard ','Microsoft.AspNetCore.Antiforgery.AntiforgeryToken.v1 '). 2016-11-01 15 : 28 : 01.4074 | 22 | DEBUG | Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.GetAndStoreTokens | 위조 방지 쿠키 토큰이 다시 사용되었습니다.2016-11-01 15 : 28 : 01.4230 | 22 | TRACE | Microsoft.Extensions.Logging.LoggingExtensions.PerformingUnprotectOperationToKeyWithPurposes | {7f02de42-e781-4c27-a2e5-fce932f4b7a4} 키의 보호를 해제하고 'C : \ temp \ wizard ','Microsoft.AspNetCore.Antiforgery.AntiforgeryToken.v1 '). 2016-11-01 15 : 28 : 01.4230 | 22 | TRACE | Microsoft.Extensions.Logging.LoggingExtensions.KeyWasNotFoundInTheKeyRingUnprotectOperationCannotProceed | 키 {7f02de42-e781-4c27-a2e5-fce932f4b7a4}을 (를) 키 링에서 찾을 수 없습니다. 보호 해제 작업을 진행할 수 없습니다. 2016-11-01 15 : 28 : 01.4230 22 | ERROR | Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame`.RequestProcessingAsync | 연결 ID "0HL02KLA3LKUJ": 처리되지 않은 예외가 응용 프로그램에 의해 throw되었습니다. 위조 방지 토큰을 해독 할 수 없습니다. 2016-11-01 15 : 28 : 01.4230 | 22 | INFO | Microsoft.AspNetCore.Hosting.Internal.HostingLoggerExtensions.RequestFinished | 요청 완료 44.7391ms 200 2016-11-01 15 : 28 : 01.4230 | 22 | DEBUG | Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Connection.Microsoft.AspNetCore.Server.Kestrel.Internal.Http.IConnectionControl.End | 연결 ID "0HL02KLA3LKUJ"가 연결 유지 응답을 완료했습니다.

업데이트

나는

services.AddDataProtection() 
      .PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp\")); 

을 추가 한, 키는 C로 유지되는 : \ 임시 \하지만 난 여전히 문제가 발생했습니다. 업데이트 된 로그는 다음과 같습니다. 키 : {f5087f37-37e3-4e52-b40b-77e32a285f3e}이 (가) c : \ temp에 기록되고 기본 키로 선택되었지만 앱에 여전히 일부 신비한 키 {4441518f-1b1d-49a8-b06a-29724cb692ae}가 있습니다. 찾을 수없는 위조 방지 토큰을 해독하는 데 사용하려고합니다.

2016년 11월 2일 07 : 19 : 28.7357 | 1 | DEBUG | Microsoft.AspNetCore.Hosting.Internal.HostingLoggerExtensions.Starting가 | 호스팅 시작 2016년 11월 2일 07 : 19 : 28.8450 | 1 | DEBUG | 마이크로 소프트 .AspNetCore.Hosting.Internal.HostingLoggerExtensions.Started | 호스팅 시작 2016-11-02 07 : 19 : 29.0326 | 7 | DEBUG | Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Connection.Start | 연결 ID "0HL035D0UCHEL" 시작되었습니다. 2016-11-02 07 : 19 : 29.1107 3 | 정보 | Microsoft.AspNetCore.Hosting.Internal.HostingLoggerExtensions.RequestStarting | 요청 시작 HTTP/1.1 POST http://apidev.brewster.ca/ application/x-www-form-urlencoded 218 2016-11- 02 07 : 19 : 29.1263 | 3 | DEBUG | Microsoft.AspNetCore.HttpOverrides.ForwardedHeadersMiddleware.ApplyForwarders | X-Forwarded-For와 X-Forwarded-Proto 사이의 매개 변수 개수 불일치.2016-11-02 07 : 19 : 29.1732 | 3 | TRACE | Microsoft.Extensions.Logging.LoggingExtensions.PerformingUnprotectOperationToKeyWithPurposes | 키 ({4441518f-1b1d-49a8-b06a-29724cb692ae}의 보호를 해제하고 'C : \ webpublish \ wizard ','Microsoft.AspNetCore.Antiforgery.AntiforgeryToken.v1 '). 2016-11-02 07 : 19 : 29.1888 | 3 | DEBUG | Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository.ReadElementFromFile | 파일 'c : \ temp \ key-f5087f37-37e3-4e52-b40b-77e32a285f3e에서 데이터 읽기. xml '. 2016-11-02 07 : 19 : 29.1888 | 3 | DEBUG | Microsoft.Extensions.Logging.LoggingExtensions.FoundKey | 발견 된 키 {f5087f37-37e3-4e52-b40b-77e32a285f3e} 2016-11-02 07 : 19 : 29.2200 | 3 | DEBUG | Microsoft.Extensions.Logging.LoggingExtensions.ConsideringKeyWithExpirationDateAsDefaultKey | 만료 날짜가있는 키 {f5087f37-37e3-4e52-b40b-77e32a285f3e} 고려하기 2017-01-31 14:11 : 02Z를 기본 키로 사용하십시오. 2016-11-02 07 : 19 : 29.2357 | 3 | DEBUG | Microsoft.Extensions.Logging.LoggingExtensions.OpeningCNGAlgorithmFromProviderWithChainingModeCBC | 체인 모드 CBC로 CNG 알고리즘 'AES'를 공급자 '에서 여는 중입니다. 2016-11-02 07 : 19 : 29.2513 | 3 | DEBUG | Microsoft.Extensions.Logging.LoggingExtensions.OpeningCNGAlgorithmFromProviderHMAC | HMAC를 사용하여 공급자 'CNG 알고리즘'SHA256 '을 여는 중입니다. 2016-11-02 07 : 19 : 29.2670 | 3 | DEBUG | Microsoft.Extensions.Logging.LoggingExtensions.UsingKeyAsDefaultKey | 키 {f5087f37-37e3-4e52-b40b-77e32a285f3e}를 기본 키로 사용. 2016-11-02 07 : 19 : 29.2670 | 3 | TRACE | Microsoft.Extensions.Logging.LoggingExtensions.KeyWasNotFoundInTheKeyRingUnprotectOperationCannotProceed | 키 {4441518f-1b1d-49a8-b06a-29724cb692ae}을 (를) 키 링에서 찾을 수 없습니다. 보호 해제 작업을 진행할 수 없습니다. 2016-11-02 07 : 19 : 29.2670 | 3 | 오류 | Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.GetCookieTokenDoesNotThrow | 토큰을 비 직렬화하는 동안 예외가 발생했습니다. 위조 토큰을 암호 해독 할 수 없습니다. 2016-11-02 07 : 19 : 29.2982 | 3 | TRACE | Microsoft.Extensions.Logging.LoggingExtensions.PerformingProtectOperationToKeyWithPurposes | 목적으로 키 {f5087f37-37e3-4e52-b40b-77e32a285f3e}에 대한 보호 작업 수행 ('C : \ webpublish \ wizard ','Microsoft.AspNetCore.Antiforgery.AntiforgeryToken.v1 '). 2016-11-02 07 : 19 : 29.2982 | 3 | TRACE | Microsoft.Extensions.Logging.LoggingExtensions.PerformingProtectOperationToKeyWithPurposes | 목적으로 키 {f5087f37-37e3-4e52-b40b-77e32a285f3e}에 대한 보호 작업 수행 ('C : \ webpublish \ wizard ','Microsoft.AspNetCore.Antiforgery.AntiforgeryToken.v1 '). 2016-11-02 07 : 19 : 29.3138 | 3 | DEBUG | Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.GetAndStoreTokens | 새로운 위조 방지 쿠키 토큰을 만들었습니다. 2016년 11월 2일 07 : 19 : 29.3296 | 3 | DEBUG | VTR.Common.Utilities.Middleware.AntiForgeryValidation.Invoke | AntiForgeryCookie [.AspNetCore.Antiforgery.2mRY6wjt_Lw, CfDJ8I9RQUQdG6hJsGopcky2kq4ayXKUx4xErDElnyDij0J31qSLHyt3oKyqJ1ocoRHYoIkK7WSpze9SVEzOan0LQTFs3SwwtvMUw_e6EUPvaPxWjH_1_pQ5DiT8hu7TM8UNWjjFT_XSkNZz-uBVHdh2CmY] 2016년 11월 2일 07 : 19 : 29.3296 | 3 | DEBUG | VTR.Common.Utilities.Middleware.AntiForgeryValidation.Invoke | XSRF 쿠키 : CfDJ8I9RQUQdG6hJsGopcky2kq45_O5j5bzBP5QyxbzIKXaSbb8K04mez2Czsa_OdCYn84bvSz2v8M-nkN_O6yorN8qfyy4mV3HdGJV3BQgWSHSFrziJfQonBKmiF4fsrmpHVX7jA6iugirWL8yNJPO35xY 2016년 11월 2일 07 : 19 : 29.3607 | 3 | DEBUG | VTR.Common.Utilities.Middleware. AntiForgeryValidation.Invoke | 양식 토큰 : CfDJ8ELeAn-B5ydMouX86TL0t6R3a1YFIaw2K3Wf6xpsbQPGztGb2uACGCdnofeFKd-woGFkwTjWQEC4Qag1E2A2RCxtvry4DJAvPSZnbKZGMd248exLwt9CX1bhWsYj8Cs6N9MvEQ38gqEXmEArDXFYMM0 2016년 11월 2일 07 : 19 : 29.3607 | 3 | DEBUG | VTR.Co mmon.Utilities.Middleware.AntiForgeryValidation.Invoke | 머리글 토큰 : 2016-11-02 07 : 19 : 29.3768 | 3 | TRACE | Microsoft.Extensions.Logging.LoggingExtensions.PerformingUnprotectOperationToKeyWithPurposes | 키 {7f02de42-e781-4c27}에 대한 보호를 해제하는 중 -a2e5-fce932f4b7a4} ('C : \ webpublish \ wizard', 'Microsoft.AspNetCore.Antiforgery.AntiforgeryToken.v1')를 사용하십시오. 2016-11-02 07 : 19 : 29.3768 | 3 | TRACE | Microsoft.Extensions.Logging.LoggingExtensions.KeyWasNotFoundInTheKeyRingUnprotectOperationCannotProceed | 키 {7f02de42-e781-4c27-a2e5-fce932f4b7a4}을 (를) 키 링에서 찾을 수 없습니다. 보호 해제 작업을 진행할 수 없습니다. 2016-11-02 07 : 19 : 29.3768 | 3 | ERROR | Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame`.RequestProcessingAsync | 연결 ID "0HL035D0UCHEL": 처리되지 않은 예외가 응용 프로그램에 의해 발생했습니다. 위조 방지 토큰을 해독 할 수 없습니다. 2016-11-02 07 : 19 : 29.3768 3 | 정보 | Microsoft.AspNetCore.Hosting.Internal.HostingLoggerExtensions.RequestFinished | 요청 완료 286.4265ms 200 2016-11-02 07 : 19 : 29.4233 | 3 | DEBUG | Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Connection.Microsoft.AspNetCore.Server.Kestrel.Internal.Http.IConnectionControl.End | 연결 ID "0HL035D0UCHEL"이 (가) 활성 응답을 완료했습니다.

+1

이 문제는 https://github.com/aspnet/Antiforgery/issues/19 및 https://github.com/aspnet/Home/issues와 관련 될 수 있습니다./240 –

답변

0

이 문제는로드 균형 조정기의 캐싱 문제로 인해 발생했습니다. 캐시가 플러시 된 후 누락 된 핵심 문제가 사라졌습니다

관련 문제