2010-07-21 29 views

回答

1

我不知道這是否是一個記錄的功能,但我會建議以下爲jumping-客點:

如果你的代碼看起來什麼都像我一樣,你有一行代碼,看起來像:

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

的第二個參數是ProcesssignInResponse HttpResponse對象。我試過了,沒有成功,找到一個回答你的問題,試圖在自定義HttpResponse消息傳遞,以捕獲輸出,所以我們可以操縱它,只要你喜歡:

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

如果您在myResponse傳遞給ProcessSignInResponse,引發以下例外:

System.NullReferenceException:未將對象引用設置爲對象的實例。用C 在System.Web.HttpResponse.End() 在Microsoft.IdentityModel.Web.FederatedPassiveSecurityTokenServiceOperations.ProcessSignInResponse(SignInResponseMessage signInResponseMessage,HttpResponse對象的HttpResponse) 在Logon_App.LCLoginBase.issueTokenAndRedirect(logonParamsStruct & logonParams):\登錄應用\登錄應用\代碼\ LCLogin \ LCLoginBase.vb:XXX行

+0

這確實看起來像一個非常有前途的想法,我會嘗試直接寫信給自己,然後再將它交給WIF。 – 2010-07-27 22:05:19

+0

驗證確實可行,但是它會創建無效的HTML,因爲寫入響應的任何內容都將在由WIF插入的html節點之外,但瀏覽器仍然可以合理地處理此問題。 – 2010-08-16 21:37:00

2

我閱讀下面的文章,http://www.paraesthesia.com/archive/2011/01/31.aspx,這使我對Microsoft.IdentityModel裝配使用dotPeek。這讓我發現,所有ProcessSignInResponse消息呢,是這樣的:

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方法執行以下操作:

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

正如你所看到的,在本質上,所有的執行,將WriteFormPost的內容寫入響應流。

因此,我們正在改變我的「ProcessSignIn」方法以返回要輸出的HTML,而不是調用FederatedPassiveSecurityTokenServiceOperations.ProcessSignInResponse

所以,我從這裏改變了我的方法主要有:

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不錯的黑客在那裏。 – 2011-07-29 12:33:38

相關問題