2010-07-21 8 views

답변

1

유사하지만, 나는 jumping-으로 다음을 제안합니다 오프 포인트 : ProcesssignInResponse

FederatedPassiveSecurityTokenServiceOperations.ProcessSignInResponse(responseMessage, HttpContext.Current.Response) 

두 번째 매개 변수는 HttpResponse에 개체입니다 : 코드가 모두 같은 광산에서 아무것도 보이는

경우처럼 보이는 코드의 라인을 가지고있다. 당신이 myResponse

Dim myStringbuilder As New StringBuilder 
Dim myStringWriter As New IO.StringWriter(myStringbuilder) 
Dim myResponse As New Web.HttpResponse(myStringWriter) 

전달하는 경우 : 그러나 나는 당신이 좋아하는 그래서 우리는 그것을 조작 할 수있는 출력을 캡처하기 위해 사용자 정의 HttpResponse 메시지를 전달하기 위해 시도하여, 질문에 대한 답을 찾기 위해, 실패, 시도 ProcessSignInResponse, 다음 예외가 throw됩니다.

System.NullReferenceException : 개체 참조가 개체의 인스턴스로 설정되지 않았습니다. C에서 Logon_App.LCLoginBase.issueTokenAndRedirect에서 System.Web.HttpResponse.End() Microsoft.IdentityModel.Web.FederatedPassiveSecurityTokenServiceOperations.ProcessSignInResponse에서 (SignInResponseMessage signInResponseMessage, HttpResponse에 HttpResponse에) (logonParamsStruct & logonParams)에서 : \ 로그온 앱 \ 로그온 앱 \ 코드 \ LCLogin \ LCLoginBase.vb : 라인 XXX

+0

이것은 매우 유망한 아이디어처럼 보입니다. 먼저 WIF에 전달하기 전에 직접 직접 답장을 보내보십시오. –

+0

실제로 작동한다는 것을 확인했지만, 응답에 쓰여지는 것이 html 노드에 삽입되는 html 노드 외부에 있기 때문에 잘못된 HTML이 생성되지만 브라우저는이를 처리 할 수 ​​있어야합니다. –

2

은 내가 Microsoft.IdentityModel 어셈블리에 dotPeek를 사용하여를 알려준 다음 문서, http://www.paraesthesia.com/archive/2011/01/31.aspx을 읽어 보시기 바랍니다.

public static void ProcessSignInResponse(SignInResponseMessage signInResponseMessage, HttpResponse httpResponse) 
    { 
     if (signInResponseMessage == null) 
     throw DiagnosticUtil.ExceptionUtil.ThrowHelperArgumentNull("signInResponseMessage"); 
     else if (httpResponse == null) 
     { 
     throw DiagnosticUtil.ExceptionUtil.ThrowHelperArgumentNull("httpResponse"); 
     } 
     else 
     { 
     signInResponseMessage.Write(httpResponse.Output); 
     httpResponse.Flush(); 
     httpResponse.End(); 
     } 
    } 

signInResponseMessage.Write 방법은 다음을 수행합니다 : 모든 ProcessSignInResponse 메시지가하는 저를 보여주는 다음 당신이 볼 수 있듯이

public override void Write(TextWriter writer) 
    { 
     if (writer == null) 
     { 
     throw DiagnosticUtil.ExceptionUtil.ThrowHelperArgumentNull("writer"); 
     } 
     else 
     { 
     this.Validate(); 
     writer.Write(this.WriteFormPost()); 
     } 
    } 

, 본질적으로 모든 것을 수행한다, WriteFormPost의 내용을 응답 스트림에 씁니다.

그래서 "ProcessSignIn"메서드를 변경하여 FederatedPassiveSecurityTokenServiceOperations.ProcessSignInResponse을 호출하는 대신 출력 할 HTML을 반환합니다.

그래서,이 본질적으로 내 방법을 변경 :

public static void ProcessSignIn(SignInRequestMessage signInRequest, HttpResponse httpResponse) 
    { 
    FederatedPassiveSecurityTokenServiceOperations.ProcessSignInResponse(signInResponseMessage, httpResponse); 
    } 

에 :

public static string ProcessSignIn(SignInRequestMessage signInRequest) 
    { 
    return signInResponseMessage.WriteFormPost(); 
    } 

물론, SignInResponseMessage는 "메인"내용을 반환하는 청소기 방법을 제공해야 양식 게시물에 작성하려는 내용 중 HTML 양식을 문자열로 사용하면 적어도 Response.Write(result)으로 클라이언트에 반환하기 전에 결과를 수정하는 것이 더 쉽습니다.

+1

+1 멋진 해킹. –

관련 문제