none
Reporting Serviceのカスタム認証拡張機能でのPostデータ受け渡しについて RRS feed

  • 質問

  • SQL Server 2016のReporting Servicesに関しての質問になります。

    現在、Reporting Servicesを利用していますが以下の理由からカスタム認証を利用して認証を実装しています。

    ・Windows認証が利用できない環境での構築が必要
     インフラの関係上ドメインがない状態の環境への構築が必要になるケースがあるためです。
    ・基本認証では都度入力の手間がかかってしまう
     別アプリケーションで既に認証済みのためReporting Services利用時に再度ユーザーに負担をかけたくないためです。
     ※別アプリケーション内のiframe内へReporting ServicesのレポートをHTML表示させています。

    以下のサイトを参考に別アプリケーションからkey情報を送り、カスタム認証側で解析し認証及び権限制御を行っています。
    ただkey情報の受け渡しをgetメソッドによるクエリストリングで行っていました。

    セキュリティ上URLにkey情報を載せたくなくpostメソッドのフォームデータに格納して渡しましたが
    カスタム認証側にpostで渡したフォームデータが渡ってきませんでした。
    「Request.QueryString」は取得できましが「Request.Form」で値が取れない状態です。

    ○カスタム認証の参考サイト
    https://docs.microsoft.com/ja-jp/sql/reporting-services/extensions/security-extension/authentication-in-reporting-services?redirectedfrom=MSDN&view=sql-server-ver15
    https://github.com/microsoft/Reporting-Services/tree/master/CustomSecuritySample


    以下のサイトで「Request.Form["SAMLResponse"].ToString();」で取得しようとしているため
    できると思っていますがどうもうまく行かない状況です。
    もし何かご存知であればご教示お願いします。

    https://www.mssqltips.com/sqlservertip/4988/sql-server-reporting-services-custom-security-with-single-signon/


    以上です。
    よろしくお願いいたします。


    2019年10月30日 13:26

回答

  • 質問者さんはこのスレッドから去ってしまったようですが、自分が関わったスレッドがこのまま放置されて終わってしまうのも何ですので、質問から状況を想像してレスを書いておきます。

    質問者さんのケースとは細かいところで違うかもしれませんが、たぶん本質は似たような話ではないかと思っています。

    > 以下のようなURLをPostしてiframeに埋め込んでいます。
    >
    > http://servername/Reportserver?/reportname&key=XXXXXX&code=XXXXXX

    > この際にカスタム認証側で「Request.QueryString」ではkey、codeともに取得できます。
    > ただクエリストリングではなくフォームデータとしてPostした場合に「Request.Form」で
    > 値が取得できません。

    上記の質問者さんの文から、上のような URL 文字列を iframe 要素の src 属性に設定しているのだろうと想像しています。(「Postして」という言葉がちょっと引っ掛かりますが)

    つまり、以下の画像の赤枠のコードのような感じだろうと思います。



    そうすると、上の画像のページが描画されるとき iframe の src 属性に url が設定され、その時点で以下の Fiddler の画像のような要求が出ます。画像の通り、key と value はクエリ文字列にしかなく、要求先では Request.QueryString では取得できるが、Request.Form では取得できないということになります。



    Request.Form で取得するには form データとして POST しなければなりませんが、その手段としては、上の私のレスで紹介した記事のように、即ち上の Visual Studio エディタ画像の青枠のコードようにすれば、以下の Fiddler 画像の通り key と code は form データとして POST され、



    下のデバッガの画像の通り Request.Form で取得できます。



    2019年11月2日 1:50

すべての返信

  • 質問からは全体的な構成が分からないのですか、以下のようなことでしょうか?

    ブラウザ ⇔ IIS ⇔ ASP.NET Web Forms アプリ ⇔ ReportViewer ⇔ SQL Server

    そして、ASP.NET フォーム認証を使ってユーザー認証をしたいということですか?
    • 編集済み SurferOnWww 2019年10月30日 15:06 誤字訂正
    2019年10月30日 14:45
  • 全体的な構成は以下のとおりです。

    ブラウザ ⇔ IIS ⇔ ColdFusion(APサーバー) ⇔ ReportViewer ⇔ SQL Server

    レポート表示ではAPサーバーの機能を利用しているわけではなくHTML+Javascriptを使用して
    iframe上にReporting Servicesのレポートを埋め込んでいます。

    実現したいことはユーザー認証で合っていますが、実装箇所はカスタム認証となります。
    現段階ではクエリストリングから認証に必要な情報は取得できており認証自体も動作しています。
    困っていることはPostしたデータが取得できないことです。

    以下のようなURLをPostしてiframeに埋め込んでいます。

    http://servername/Reportserver?/reportname&key=XXXXXX&code=XXXXXX

    この際にカスタム認証側で「Request.QueryString」ではkey、codeともに取得できます。
    ただクエリストリングではなくフォームデータとしてPostした場合に「Request.Form」で
    値が取得できません。
    このデータが取得できれば認証処理自体は動作しているため問題ないのですが・・・。

    2019年10月31日 6:08
  • IIS 上で動いているのは ASP.NET Web Forms アプリのように思えますが、違うのでしょうか? 違わなければそのあたりのもっと詳しい情報 (ページのコードと問題の再現手順) を提供できませんか?
    2019年11月1日 2:28
  • ↓ こういう話なんですか?

    postメソッドを介してiframeにデータを送信する
    https://codeday.me/jp/qa/20190303/350091.html

    違うのであればどう違うのか説明してください。

    2019年11月1日 6:23
  • 質問者さんはこのスレッドから去ってしまったようですが、自分が関わったスレッドがこのまま放置されて終わってしまうのも何ですので、質問から状況を想像してレスを書いておきます。

    質問者さんのケースとは細かいところで違うかもしれませんが、たぶん本質は似たような話ではないかと思っています。

    > 以下のようなURLをPostしてiframeに埋め込んでいます。
    >
    > http://servername/Reportserver?/reportname&key=XXXXXX&code=XXXXXX

    > この際にカスタム認証側で「Request.QueryString」ではkey、codeともに取得できます。
    > ただクエリストリングではなくフォームデータとしてPostした場合に「Request.Form」で
    > 値が取得できません。

    上記の質問者さんの文から、上のような URL 文字列を iframe 要素の src 属性に設定しているのだろうと想像しています。(「Postして」という言葉がちょっと引っ掛かりますが)

    つまり、以下の画像の赤枠のコードのような感じだろうと思います。



    そうすると、上の画像のページが描画されるとき iframe の src 属性に url が設定され、その時点で以下の Fiddler の画像のような要求が出ます。画像の通り、key と value はクエリ文字列にしかなく、要求先では Request.QueryString では取得できるが、Request.Form では取得できないということになります。



    Request.Form で取得するには form データとして POST しなければなりませんが、その手段としては、上の私のレスで紹介した記事のように、即ち上の Visual Studio エディタ画像の青枠のコードようにすれば、以下の Fiddler 画像の通り key と code は form データとして POST され、



    下のデバッガの画像の通り Request.Form で取得できます。



    2019年11月2日 1:50
  • kuidaoreさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    ご質問いただいた件ですが、その後いかがでしょうか。
    SurferOnWwwさんから寄せられた投稿はお役に立ちましたか。

    参考になった投稿には [回答としてマーク] をお願い致します。

    設定いただくことで、
    他のユーザーもお役に立つ回答を見つけやすくなります。

    お手数ですが、ご協力の程どうかよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年11月4日 2:46
    モデレータ
  • 返信が遅くなり申し訳ありません。

    結果としてご回答していただいた内容により解決いたしました。
    質問内容や状況説明が足らないにも関わらず推測して丁寧にご返答いただきありがとうございます。

    意図としては上記の「postメソッドを介してiframeにデータを送信する」のとおりです。
    そのサイトも確認しておりその方法でpostメソッドを介してデータを送信するように実装しております。
    実際にiframeにレポートを表示するために以下のURLをactionに設定し、
    key、codeについては「input type="hidden"」で保持してsubmitしていました。

    http://servername/Reportserver?/reportname&key=XXXXXX&code=XXXXXX

    この際にpostメソッドした際のデータが取得できていなかったのは「http://servername/Reportserver」にアクセスした際に
    CustomSecurity内でLogon.aspxにgetメソッドでredirectしていたためpostメソッドで送信したデータが受け取れていませんでした。

    ご指摘いただいた通りLogon.aspxに直接postメソッドでデータを送信して問題なくRequest.Formで受け取り認証まで行えました。
    ReportingServieceとして一度認証が通ればその後のレポートはブラウザが閉じるまでは保持されるため以下の順でデータ送信することで実現が出来ました。

    1.http://servername/Reportserver/Logon.aspxにpostメソッドで認証データを送信して認証
    2.http://servername/Reportserver?/reportnameにpostメソッドでパラメータ送信してレポート表示

    あらためてになりますが、ご回答ありがとうございました。
    2019年11月4日 9:14