2014-12-24 3 views
2

암호 재설정 끝점을 구현하고 토큰이 포함 된 전자 메일 메시지의 클릭 연결을 허용하는 ASP.NET MVC5 작업 메서드를 만듭니다. 구현시 OWIN 미들웨어를 사용하며 ASP.NET Identity 2.1 samples application과 매우 흡사합니다.ASP.NET MVC5 OWIN이 긴 URL을 거부합니다.

var token = await UserManager.GeneratePasswordResetTokenAsync(user.Id); 
var encoded = HttpServerUtility.UrlTokenEncode(Encoding.UTF8.GetBytes(token)); 
var uri = new Uri(Url.Link("ResetPasswordRoute", new { id = user.Id, token = encoded })); 
이메일 메시지의 링크가 받아들이는 MVC 끝점을 대상

:

는 샘플 용도별 같이, 토큰 메일로 사용자에게 전송 된 URL에 UserManager 의해 생성 매립 그 루트 세그먼트 중 하나의 토큰 파라미터 :

[Route("reset-password/{id}/{token}"] 
public async Task<ActionResult> PasswordResetAsync(int id, string token) 
{ 
    token = Encoding.UTF8.GetString(HttpServerUtility.UrlTokenDecode(token)); 

    // Implementation here 
} 

하지만, (상술 한 방법으로 생성 된 URL을 사용하여)이 엔드 포인트에 요청 Bad Request - Invalid URL 실패.

URL이 너무 길어서이 오류가 발생하는 것으로 보입니다. 특히 토큰 세그먼트를 자르면 MVC 끝점에 올바르게 연결됩니다 (물론 토큰 매개 변수가 더 이상 유효하지 않지만). 특히 다음 잘린 URL은 ...

http://localhost:53717/account/reset-password/5/QVFBQUFOQ01uZDhCRmRFUmpIb0F3RS9DbCtzQkFBQUFzcko5MEJnYWlrR1RydnVoY2ZwNEpnQUFBQUFDQUFBQUFBQVFaZ0FBQUFFQUFDQUFBQUNVeGZZMzd4OTQ3cE03WWxCakIwRTl4NkVSem1Za2ZUc1JxR2pwYnJSbmJ3QUFBQUFPZ0FBQUFBSUFBQ0FBQUFEcEpnVXFXS0dyM2ZPL2dQcWR1K2x6SkgxN25UVjdMYlE2UCtVRG4rcXBjU0FBQUFE 

작동 ...하지만 하나 개의 추가 문자가 추가되는 경우가

http://localhost:53717/account/reset-password/5/QVFBQUFOQ01uZDhCRmRFUmpIb0F3RS9DbCtzQkFBQUFzcko5MEJnYWlrR1RydnVoY2ZwNEpnQUFBQUFDQUFBQUFBQVFaZ0FBQUFFQUFDQUFBQUNVeGZZMzd4OTQ3cE03WWxCakIwRTl4NkVSem1Za2ZUc1JxR2pwYnJSbmJ3QUFBQUFPZ0FBQUFBSUFBQ0FBQUFEcEpnVXFXS0dyM2ZPL2dQcWR1K2x6SkgxN25UVjdMYlE2UCtVRG4rcXBjU0FBQUFEf 

나는 기본 IIS 구성이 maxUrlLength 설정을 믿고 ... 실패 내가하려고하는 것과 호환되어야하지만, 문제를 해결하지 못한 큰 값으로 명시 적으로 설정하려고 시도했습니다. 긴 URL이 함께 거부되는 반면, 서버 응답을 검사 피들러를 사용하지만

, 나는 ... ... 작업 URL은 다음 헤더와 서버 응답을 생성하는

Server: Microsoft-IIS/8.0 

를 볼 수 있습니다 다음 헤더를 포함하는 응답 ...

Server: Microsoft-HTTPAPI/2.0 

이것은 IIS가 URL을 거부하는 것이 아니라 미들웨어 구성 요소에 의해 거부되었다는 것을 의미합니다.

그래서 나는 그 구성 요소가 무엇인지, 그리고 어떻게 그 효과를 해결할 수 있는지 궁금합니다.

제안 사항을 알려주십시오.

많은 감사, 팀

참고 : Base64로 위 내 구현이 URL에서 사용하기 전에 토큰을 인코딩하지만, 나는 또한 URL 인코딩에 의존하는 샘플 코드에서 사용하는 간단한 방법으로 실험을 UrlHelper.RouteUrl에서 제공됩니다. 두 기술 모두 동일한 문제로 고통 받고 있습니다.

답변

3

길이가 255 자 정도로 제한되어 있으므로 URL의 응용 프로그램 경로에 이러한 긴 값을 전달하면 안됩니다.

약간 더 나은 대안 대신 쿼리 문자열 매개 변수를 사용하는 것입니다

http://localhost:53717/account/reset-password/5?token=QVFBQUFOQ01uZDhCRmRFUmpIb0F3RS9DbCtzQkFBQUFzcko5MEJnYWlrR1RydnVoY2ZwNEpnQUFBQUFDQUFBQUFBQVFaZ0FBQUFFQUFDQUFBQUNVeGZZMzd4OTQ3cE03WWxCakIwRTl4NkVSem1Za2ZUc1JxR2pwYnJSbmJ3QUFBQUFPZ0FBQUFBSUFBQ0FBQUFEcEpnVXFXS0dyM2ZPL2dQcWR1K2x6SkgxN25UVjdMYlE2UCtVRG4rcXBjU0FBQUFEf

은 브라우저에 따라 적어도 2000 자 (전체 URL)에 대한 안전과 설정을 IIS해야한다고.

더 안전하고 확장 가능한 접근 방식은 HTTP 헤더 내에 토큰을 전달하는 것입니다.

+2

전자 메일의 링크에서 토큰이있는 헤더를 실제로 전달할 수 없습니다. – trailmax

+0

감사합니다 - 귀하의 제안을 시도하고 완벽하게 작동합니다. –