23

「インターネットアプリケーション」テンプレートを使用して、新しいASP.NET MVC 3 / .NETFramework4.0サイトを作成しました。Nugetを使用してWindowsAzureWebロール(MVC3)パッケージをインストールし、アクセス制御サービスのウォークスルーに従ってWindowsLiveIDとGoogle認証をセットアップしました。

すぐに、「潜在的に危険なRequest.Form値がクライアントから検出されました」というエラーが発生し、Windows IdentityFoundationwikiの記事に従って解決を試みました。残念ながら、私が試したことはありません。

  • ルートweb.configとViews\web.configの両方で設定<httpRuntime requestValidationMode="2.0"/>します<pages validateRequest="false">

  • SampleRequestValidatorWIF SDKからプロジェクトにコピーし<httpRuntime requestValidationType="SampleRequestValidator"/>、両方のweb.configsで設定します

私もこれらのバリエーションを試しましたが、成功しませんでした。

何か案は?

完全な例外は次のとおりです。


例外の詳細:System.Web.HttpRequestValidationException:潜在的に危険なRequest.Form値がクライアントから検出されました(wresult = " <t:RequestSecurityTo...")。

説明:要求の検証により、潜在的に危険なクライアント入力値が検出され、要求の処理が中止されました。この値は、クロスサイトスクリプティング攻撃など、アプリケーションのセキュリティを危険にさらそうとしていることを示している可能性があります。ページがアプリケーション要求の検証設定を上書きできるようにするには、httpRuntime構成セクションのrequestValidationMode属性をrequestValidationMode="2.0"に設定します。例:<httpRuntime requestValidationMode="2.0" /><pages>この値を設定した後、Pageディレクティブまたは構成セクションでvalidateRequest = "false"を設定することにより、要求の検証を無効にできます。ただし、この場合、アプリケーションですべての入力を明示的にチェックすることを強くお勧めします。詳細については、 http: //go.microsoftを参照してください。

スタックトレース:

[HttpRequestValidationException(0x80004005):潜在的に危険なRequest.Form値がクライアントから検出されました(wresult = " <t:RequestSecurityTo...")]

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)+75
Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.CanReadSignInResponse(HttpRequest request、Boolean onPage)+205
Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.CanReadSignInResponse(HttpRequest request)+41
Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.OnAuthenticateRequest(オブジェクト送信者、EventArgs args)+117
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+148
System.Web.HttpApplication.ExecuteStep(IExecutionStep step、Boolean&completedSynchronously)+75

4

9 に答える 9

19

投稿先のコントローラーアクション(およびこの例外をスローするアクション)を[ValidateInput(false)]属性で装飾してみてください(そのままにしておくこと<httpRuntime requestValidationMode="2.0"/>web.config)。

于 2011-05-07T07:24:29.787 に答える
16

私も同じ問題を抱えていました。

これが私の解決策の例です:

 [ValidateInput(false)]

    public ActionResult *YourMethodName*(FormCollection forms)
    {
          // Encoded String
          string EncodedValue = Server.HtmlEncode(forms[*name or index*]);

         // Normal String 
         string value = forms[*name or index*]

         //.... 
    }

webconfigには何も必要ありません。

于 2011-11-07T21:12:14.973 に答える
13

私はこれについて小さなブログメモをここに書きました:http://erikbra.wordpress.com/2012/04/17/wif-saml-token-post-and-requestvalidationmode2-0/。リクエストの検証をオフにしたり、サイト全体で2.0に設定したりする必要はありません。

requestValidationModeつまり、 WIFがSAMLトークンをポストバックする特定のURLで2.0モードに変更するだけで済みます。これは、次のように、web.configの要素(詳細については、場所要素(ASP.NET設定スキーマ)を参照)を使用して実行できます。

<location path="WIFHandler">
  <system.web>
    <httpRuntime requestValidationMode="2.0" />
  </system.web>
</location>

「WIFHandler」の場所はアプリに存在する必要はありません。ASP.NETがリクエストを処理しようとする前にWIFがパイプラインをショートカットし、代わりにリターンURL(SAMLトークンPOSTruのパラメーター内)にリダイレクトするためです。wctx

web.configファイルのWIF構成セクションで、「reply」パラメーターを、要求検証モードを2.0モードに設定した場所と一致させてください。

<microsoft.identityModel>
    <service>
      <federatedAuthentication>
        <wsFederation passiveRedirectEnabled="true" 
                      issuer="https://localhost/STS/" 
                      realm="https://localhost/MyApp/"
                      reply="https://localhost/MyApp/WIFHandler/" />

(...)
于 2012-04-17T19:04:23.453 に答える
2

SampleRequestValidatorをWIFSDKからプロジェクトにコピーし、両方のweb.configsで設定します

これで修正されるはずです。コードが実際に実行されていることを確認できますか?Requestバリデーターにブレークポイントを設定すると、ヒットしますか?

私はあなたが右下に置い<httpRuntime...><system.web>と思いますか?

于 2011-05-07T16:35:31.350 に答える
2

最初に-これがどこから来ているのか狭い。フィドラーを使用して、問題の原因となっているフィールドを調査します。次のような単純なアイテム:<sは、エンコードせずに投稿するとこのエラーが発生します。また、モデルを[AllowHtml]属性で装飾し、2.0エンコーディングを有効にしないようにすることもできます。これは少し危険です。

于 2011-05-07T16:12:27.093 に答える
2

ここでこれについて言及している答えは見当たりません。だからここに行きます。

「[ValidateInput(false)]」に加えて、aspxで、これを<%@Page...>に追加する必要がある場合があります。

<%@ Page ValidateRequest="false">

これにより、Webアプリ全体ではなく、ページごとにリクエストの検証を無効にすることができます。

于 2013-10-30T08:47:15.627 に答える
1

「ActiveDirectoryからWindowsAzureアプリケーションへのシングルサインオン」チュートリアルを実行しているときに、この問題に遭遇しました。私の場合、問題は、web.configファイル<httpRuntime ... />の間違ったセクションに誤って値を配置した<system.web />ことでした(最初は気づいていませんでしたが、<location>システムを含む「FederationMetadata」のパスを持つ新しいセクションがあります。ウェブ。)。値はトップレベルの<system.web>セクションに配置する必要があります。

于 2011-12-07T18:40:21.027 に答える
0

一見すると、AzureMvc3ライブラリのバグのように見えます。MVC 3は、Formコレクションから未検証の値を取得できる特別なAPIを公開していますが、モジュールはそれらを使用していないようです。

于 2011-05-07T16:10:06.627 に答える
-1

これが機能しない技術的な理由を見つけることができませんでした。ただし、ビジネス要件の観点からは、これは、ページにアクセスする前に認証を求めるプロンプトが表示されるため、特定のソリューションの基礎となる間違ったサンプルです。ただし、「ログオン」ボタンを使用できるように、ホームページへのアクセスは匿名である必要があります。

代わりに、これらの要件を満たし、機能するMVC3カスタムログインサンプルを見つけました。

于 2011-05-08T20:28:53.780 に答える