18

最初の質問!


環境

MVC、C#、AppHarbor。

問題

私はopenidプロバイダーを呼び出しており、ドメインに基づいて絶対コールバックURLを生成しています。

私のローカルマシンでは、これは私がヒットした場合に正常に動作しますhttp://localhost:12345/login

Request.Url; //gives me `http://localhost:12345/callback`

ただし、展開しているAppHarborでは、「http://sub.example.com/login」でアクセスしている場合でも、非標準のポートを使用しているためです。

Request.Url; //gives me http://sub.example.com:15232/callback

ポート番号が元のソースURLになかったので、これは私のコールバックを台無しにします!

私はもう試した

  • Request.Url
  • Request.Url.OriginalString
  • Request.RawUrl

すべてが私に「http://sub.example.com:15232/callback」を与えます。

また、これがレルムの問題ではないことを明確にするために、DotNetOpenAuthから表示されるエラーメッセージは次のとおりです。

'http://sub.example.com:14107/accounts/openidcallback' not under realm 'http://*.example.com/'. 

私はそれを詰め込んだとは思わないのですか?

今、私はいくつかのハッキーなものを検討しようとしています

  • プリプロセッサコマンド(#IF DEBUG THEN PUT PORT)
  • 文字列置換(Request.URL.Contains( "localhost"))

これらはすべて100%の解決策ではありませんが、私が見逃している単純なプロパティである可能性があるものについて熟考することにうんざりしています。私もこれを読みましたが、それは受け入れられた答えを持っていないようです(そしてそれは権威よりもむしろ道についてです)。だから私はあなたたちにそれを置いています。

概要

したがって、持っている場合は、リクエストコンテキストからhttp://localhost:12345/login取得する必要があります。http://localhost:12345/callback

また、「http://sub.example.com/login 」がある場合は、どのポートにあるかに関係なく、「http://sub.example.com/callback」取得する必要があります。

ありがとう!(睡眠時間、午前中に質問に答えます)

4

6 に答える 6

22

これは、AppHarborのような負荷分散されたセットアップでよくある問題です。回避策の例を示しました。

更新:多くのASP.NETアプリケーションにとってより望ましい解決策は、aspnet:UseHostHeaderForRequestUrlappSettingをに設定することtrueです。私たち(AppHarbor)は、WCFアプリでの使用で問題が発生することをいくつかのお客様に見てきました。そのため、デフォルトでは有効にしておらず、そのような状況では上記のソリューションをお勧めします。AppHarborの「構成変数」を使用して構成し、デプロイ時にアプリ設定を挿入できます。詳細については、この記事を参照してください。

于 2011-10-09T00:52:20.807 に答える
1

最近、URLを現在のURLと比較し、それに基づいてナビゲーションを強調表示するという問題が発生しました。ローカルでは機能しましたが、本番環境では機能しませんでした。

私はhttp://example.com/path/to/file.aspx自分のファイルとして持っていましたが、そのファイルを表示して実行すると、負荷分散された本番環境Request.Url.ToString()で作成されました。https://example.com:81/path/to/file.aspx

今、私はRequest.Url.AbsolutePath私に与えるために使用して/path/to/file.aspxいるので、スキーマ、ホスト名、およびポート番号を無視します。

使用した各ナビゲーションアイテムのURLと比較する必要がある場合: New Uri(theLink.Href).AbsolutePath

于 2013-05-23T14:34:21.357 に答える
0

私の最初の考えは、リファラー変数を取得し、それにポートが含まれているかどうかを確認することです。含まれている場合は、使用しないでください。

プロキシがリファラーヘッダー変数を削除する可能性があるため、それがオプションでない場合は、クライアント側のスクリプトを使用して場所を取得し、サーバーに返す必要がある場合があります。

AppHarborはIISサーバーへのポート転送を使用していると思います。そのため、サイトはパブリックにポート80にありますが、IISは別のポートでホストされているため、クライアントが接続しているポートを認識できません。

于 2011-10-06T13:38:50.953 に答える
0

何かのようなもの

String port = Request.ServerVariables["SERVER_PORT"] == "80" ? "" : ":" + Request.ServerVariables["SERVER_PORT"];
String virtualRoot = Url.Content("~/");
destinationUrl = String.Format("http://{0}{1}{2}", Request.ServerVariables["SERVER_NAME"], port + virtualRoot, "/callback");
于 2011-10-06T13:52:00.887 に答える
0

フレームワークでUrlBuilderクラスを使用すると、これを簡単に回避できます。Builderクラスで、ポートを-1に設定すると、ポート番号が削除されます。

new UriBuilder("http://sub.example.com:15232/callback"){ Port = -1}

戻り値:http ://sub.example.com/callback

ローカルマシンのポート番号を保持するには、Request.IsLocalを確認し、ポートに-1を適用しないでください。

これを拡張メソッドにラップして、クリーンに保ちます。

于 2014-03-11T18:13:45.083 に答える
0

これは古いスレッドだと思います。この問題は、IIS 7.5で、Apacheプロキシを前面に置いてMVC5を実行するときに発生しました。サーバーの外部では、asp.netアプリがカスタムポートを使用してApacheからURLを取得するため、「EmptyResponse」が表示されます。

「カスタム」ポートを含めずにアプリをサブパスにリダイレクトするには、Response / Requestオブジェクトを忘れて、Transferメソッドを使用します。たとえば、ユーザーがまだログインしていない場合に、ユーザーがログインページに自動的にリダイレクトされるようにするには、次のようにします。

if (!User.Identity.IsAuthenticated)   
    Server.TransferRequest("Account/Login");
于 2015-09-18T14:08:25.397 に答える