2011-03-26 58 views
8

在我的MVC3網站,我已經避免使用新的ValidateInput屬性設置requestValidationMode =「2.0」,但現在我試圖切換到WIF進行身份驗證,並且當STS重定向回到我的網站,我得到的例外,因爲WSFederationAuthenticationModule.IsSignInResponse調用Request.Form,而不是Request.Unvalidated().Form ...有沒有辦法處理這個,而不會去requestValidationMode =「2.0」(我真的不想這樣做)。WSFederationAuthenticationModule.IsSignInResponse中潛在危險的Request.Form

這裏是堆棧跟蹤,所以你可以看到我的意思。我的控制器的方法從來沒有真正被調用。

[HttpRequestValidationException (0x80004005): A potentially dangerous Request.Form value was detected from the client (wresult="<trust:RequestSecuri...").] 
    System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection) +8755668 
    System.Web.HttpRequest.ValidateNameValueCollection(NameValueCollection nvc, RequestValidationSource requestCollection) +122 
    System.Web.HttpRequest.get_Form() +114 
    Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.IsSignInResponse(HttpRequest request) +21 
    Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.CanReadSignInResponse(HttpRequest request, Boolean onPage) +121 
    Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs args) +78 
    System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75 

回答

12

處理這個問題的正確方法是添加特定的驗證程序到HttpRuntime,知道如何檢測有效的安全令牌。

看任何這裏的例子:http://claimsid.codeplex.com/releases/view/62929

下面是從那些之一的摘錄(樣品#5噸具體這也是一個MVC應用程序):

namespace FShipping 
{ 
    using System; 
    using System.Web; 
    using System.Web.Util; 
    using Microsoft.IdentityModel.Protocols.WSFederation; 

    public class WsFederationRequestValidator : RequestValidator 
    { 
     protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex) 
     { 
      validationFailureIndex = 0; 
      if (requestValidationSource == RequestValidationSource.Form && 
       collectionKey.Equals(WSFederationConstants.Parameters.Result, StringComparison.Ordinal)) 
      { 
       if (WSFederationMessage.CreateFromFormPost(context.Request) as SignInResponseMessage != null) 
       { 
        return true; 
       } 
      } 

      return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex); 
     } 
    } 
} 

這裏的配置:

<system.web> 
... 
    <httpRuntime requestValidationType="FShipping.WsFederationRequestValidator" /> 
</system.web> 
+1

@Euginio:謝謝你,這些信息顯然是在[2010年8月2日發佈的「索賠身份指南」一書中](http://claimsid.codeplex.com/releases/view/50000)中添加的。這會在不久的將來成爲官方文檔嗎? [MSDN](http://www.google.com/search?q=%2BWIF+%2BRequestValidator+site%3Amsdn.microsoft.com+-site%3Asocial.msdn.microsoft.com)和[TechNet](http:// www.google.com/search?q=%2BWIF+%2BRequestValidator+site%3Atechnet.microsoft.com+-site%3Asocial.technet.microsoft.com)完全沒有提到這一點。 WIF已知問題頁面的更新似乎至少是按順序進行的。 – 2011-03-27 05:55:29

+0

這看起來像比我想出的更清潔的解決方案,即將驗證設置爲2.0,並在Global.asax.cs中的Application_BeginRequest代碼中使用類似的代碼在除登錄回發之外的所有情況下調用Request.ValidateInput() 。 – Jaykul 2011-03-27 17:14:06

+0

而且,它的工作;-) – Jaykul 2011-03-27 17:24:49

2

我認爲,我們還在某一時刻觀察到同樣的錯誤,但是如果我沒有記錯,這是在一些實驗或測試腳手架代碼,所以我們並沒有一個嚴格的安全需求在那裏。

我能找到的官方信息是,這是WIF中的一個已知問題:請參閱the WIF Known Issues page開頭處的「ASP.NET檢測到被動聯合標記爲潛在安全攻擊」部分。他們說在那裏設置validateRequest="false"web.config或等效的ASP.NET Page指令在頁面級執行此操作。

因此,您可以嘗試在應用程序的「主頁」上僅在Page指令中設置此項,我不確定但可以。

注意,他們不已知問題頁面WIF談論requestValidationMode="2.0",但是從this TechNet wiki page判斷這一額外的設置是必要的ASP.NET 4

+0

嘿,感謝您對已知問題的鏈接 - 它看起來像WIF的只是不適應MVC3,並且無法訪問Validation.Unvalidated http://msdn.microsoft.com/en-美國/庫/system.web.helpers.validation.unvalidated%28v=vs.99%29.aspx(如果沒有人能真正給我一個解決方法,我會將其標記爲答案,但這讓我非常難過)。 – Jaykul 2011-03-26 18:50:19

相關問題