質問者
異なるサイト間による値の受け渡しについて

質問
-
以下の2つのサイトがあり、サイトAで入力された値をサイトBに、
ユーザが視覚により認識出来ず、
閲覧履歴残らない方法で受け渡す事は可能でしょうか。
2つのサイトの認証方法の設定は以下の通りです。
サイトA:統合Windows認証 → 有効、匿名認証 → 無効
サイトB:統合Windows認証 → 無効、匿名認証 → 有効
上記の場合、サイトが異なる為、Session変数ではやり取りできないと
考えております。
また、QueryStringではURLに値が表示されてしまう為、問題があります。
FormのMethodをPOSTにし、Submmitした場合、サイトが異なっていても
例えば、Hiddenなどの値をサイトBが取得する事は可能でしょうか。
環境は、.NET FREMEWORK 3.5 IIS ver7
すべての返信
-
すみません、あまり詳しなくて
弊社の開発されているパッケージはfrom認証で作成されていますが、お客様から
シングルサインオンで弊社パッケージを利用したいとご要望がありました。
弊社パッケージをWindows認証に変更することは、困難なため
別サイトでWindows認証にしてログインユーザを取得し
Active Directoryのアカウント情報から社員番号を取得し
弊社パッケージに引渡しのform認証のを通過させるようにしたいのです。
その際、引き渡す社員番号を隠匿したいのです。
サイト A と サイト B 両方ともイントラネット内です、匿名認証を許可してある理由は、
弊社パッケージ動作設定になっています。
サイト A も サイト B も ASP.NET ベースの Web アプリで、Web Forms です。
-
> 弊社の開発されているパッケージはfrom認証で作成されていますが、お客様から
> シングルサインオンで弊社パッケージを利用したいとご要望がありました。Active Directory の資格情報ストアを利用してフォーム認証を行う手段は用意されていますが(下記のページ参照)、いずれもフォーム認証としての認証手続きが必要で、統合 Windows 認証を利用してのシングルサインオンというのは無理っぽいです。
それは、最初の質問にあった、サイト A からサイト B への POST が可能だったとしても同じことで、シングルサインオンと言うのは、自分が知る限りですが、まず無理だと思います。
ActiveDirectoryMembershipProvider クラス
http://msdn.microsoft.com/ja-jp/library/system.web.security.activedirectorymembershipprovider(v=vs.110).aspxASP.NET からの Active Directory ドメイン サービス認証
http://msdn.microsoft.com/ja-jp/library/ms180890.aspxセキュリティ保護された ASP.NET アプリケーションの構築 :
認証、認定、および通信のセキュリティ保護 Active Directory でフォーム認証を使用する方法
http://msdn.microsoft.com/ja-jp/library/cc465526.aspx
単なる思い付きですが、サイト A とサイト B を別サイトに分けず、サイト A の下に別アプリケーションを作って、フォーム認証が必要なパッケージはそのアプリケーションに配置し、ユーザーがサイト A に最初にアクセスした時フォーム認証用の認証クッキーを発行すると言うようなことができれば、見かけシングルサインオンにすることは可能かもしれません。- 編集済み SurferOnWww 2014年3月19日 5:06 一部訂正
-
匿名認証が無効だとユーザーのログオン情報が取れますので簡単なんですが・・・
(参考)
ASP.NETでログインユーザー情報を取得したいのですが
http://qa.atmarkit.co.jp/q/815[PRB] ASP.NET で Request.ServerVariables("LOGON_USER") が空の文字列を返す
http://support.microsoft.com/kb/306359/ja★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
-
> 匿名認証が無効だとユーザーのログオン情報が取れますので簡単なんですが・・・
簡単と言うのはどういう意味でしょう?
サイト A が統合 Windows 認証、サイト B がフォーム認証で、サイト A で認証されればサイト B でも自動的に認証されるということが質問者さんのやりたいことと理解していますが、それは「簡単」ではないですよね。
#ちなみに、Page.User.Identity.Name で取得できるのは、Windows 認証か Froms 認証か、認証済みか否かによって変わってくるはずです。
ASP.NET の ID オブジェクト
http://surferonwww.info/BlogEngine/post/2014/01/20/id-objects-in-aspnet-page.aspx -
匿名認証が無効ですと、サーバー変数のLOGON_USERでユーザーのログオン情報が取れます。ドメインにログオンしていれば、ドメイン名\ユーザー名で取れます。
簡易的ですが、このドメイン名で判断すればドメインにログオンしていることがわかりますので、それをもって認証完了となります。
要するにサイトBでもユーザー名、パスワードを入力したくないということですよね? それであればこの方法でも可能だと思いました。#追記。パソコンが変ったらダメでしょうが・・・
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
- 編集済み trapemiyaModerator 2014年3月19日 6:09 追記
-
仕組みでいうならADFSとかが対応しそうですが、そういう仕組みを利用しないのであれば、手作りが必要になると思います。
一般的には(というかこういう認証連携では)、認証を行う側と、それを利用する側で認証情報を安全に受け渡す必要があります。
※安全の程度は要件次第・渡すデータが見えないこと(実際には不要なことも多い、秘密情報の場合のみ必要)
・渡すデータをねつ造できないこと
・渡すデータを再送できないこと辺りがまあ通常最低限求められる条件で、それをどうやって担保するかになります。
ありがちな方法は、
・証明書(の公開鍵)または共有鍵をサイト間で共有
・受け渡すデータを用意(ユーザID等のユーザ識別情報、場合によっては付随情報)
・データにタイムスタンプを追加(再送防止のため)
・必要に応じて、受け渡す秘密情報を共有鍵で暗号化(あるいは証明書とか利用でもなんでも可)
・受け渡す情報に、共有鍵または証明書や秘密鍵で署名・受け取った側では、受け取った情報を教諭鍵または証明書や公開鍵で検証、タイムスタンプも確認
・検証OKなら、受け渡されたデータ(必要に応じて復号)を元にForm認証ログインみたいな感じになります。
なるべくシンプルにするのであれば、共有鍵だけ共有して、HMACSHA~やRfc2898DeriveBytesなどで署名(MAC)をつける、みたいのが実装簡単といえば簡単です。
参考まで。
----追記
ADFSって書きましたが、そもそもForm認証をやめられるならそんな大げさなことは元から必要ないので、ADFSに関してはちょっとずれてそうですね。
※ADFS使えるくらいならForm認証を変えることぐらいできそうな気がする- 編集済み なちゃ 2014年3月19日 6:33
-
質問者さんのいないところで、質問者さんの真意が分からないまま議論しても意味がないかもしれませんが・・・
> 要するにサイトBでもユーザー名、パスワードを入力したくないということですよね?
単にそれだけの理由ではないと思いますが。
そうであれば、サイト B もサイト A も両方イントラ内とのことですので、両方とも統合 Windows 認証にすれば済むはずです。
「弊社の開発されているパッケージはfrom認証で作成」と言う意味ははっきりしませんが、そのパッケージは ASP.NET 標準のフォーム認証の仕組みと何か絡んでいると想像して回答しています。
それから、
> 匿名認証が無効ですと、ユーザーのログオン情報が取れます。
というのは、匿名認証が無効だとユーザーはログオンせざるを得ないから、結果的に LOGON_USER でユーザー情報が取得できると言う意味ですよね?
また、ユーザー情報が取得できても、サイト A が統合 Windows 認証で、サイト B はフォーム認証なので、取得できるユーザー情報は違ってくるかと・・・(trapemiya さんが言われる LOGON_USER と Page.User.Identity.Name は同じ結果になると理解してます。違っていたら指摘ください)
-
私の書き込みは一つのアイディアであって、これで実装しなさいとか勧めているわけではありません。いろいろな情報を質問者さんが得ることによって、何かのヒントになれば良いと思っています。もちろん、私の回答が役に立たないかもしれません。ただ、それでもこういうこともできるということが、今回、もしくは将来、何かの糸口になればそれで十分だと思います。
#実際、サイトBは匿名認証なんでどうしようもないです・・・
>また、ユーザー情報が取得できても、サイト A が統合 Windows 認証で、サイト B はフォーム認証なので、取得できるユーザー情報は違ってくるかと・・・とりあえず私が認識したのは、社員番号さえ渡れば良いと受け取れたので、であれば、統合Windows認証とフォーム認証のユーザーは同一というのが根底にあります。
>(trapemiya さんが言われる LOGON_USER と Page.User.Identity.Name は同じ結果になると理解してます。違っていたら指摘ください)ごめんなさい。Page.User.Identity.Name に触れてなかったですね。というのも、クラシックASP時代の癖というか、LOGON_USERの方が親しみがあるからで、Page.User.Identity.Nameはよくわからないからです。
と、ここで終わっても仕方ないので少し調べてみましたところ、LOGON_USERの方が確実っぽいです。what's the difference between User.Identity.Name and Request.ServerVariables["LOGON_USER"] ?
http://forums.asp.net/t/989578.aspx#(追記)「簡単」という表現は確かに良くなかったですね。解決策のように取られかねません。「簡単」という言葉を使った意味は、複雑な仕組みを構築しなくてもログオンしているユーザーの情報が取れるので、それを使ってシングルサインオン(的?)なことが簡単にできるんじゃない?という意味でした。今回は匿名認証ではないので、あくまで一般的にということです。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
- 編集済み trapemiyaModerator 2014年3月19日 7:12 追記