うまくいけば、私は本当に単純で明白な何かを見逃しているだけです-なぜ、そしてもっと重要なことに、リダイレクト中にプロトコルをどのように維持(または強制)するのLogin
ですか?
説明する:
https
login
ませんが、示されているように、リダイレクト(らしい)はそれを維持していません。 私が試したもの:
RequireHttps
使用できる属性がありますが、次のとおりです。
http
ボックス( es)/ application)。これは実際に私のプロダクションケースです...私はすでにIISURLの書き換えも設定しています(サイト全体でhttpsへの正規ルール)。 これは「無視」されているようです (ルールは「https」をチェックしません。そうでない場合は同じリダイレクトループが発生します)。
絶対URLをLoginPath
(でCookieAuthenticationOptions
)設定しようとしましたが失敗しました。それができないためです...
アドバイスやポインタをありがとう...
「なぜ」?
- ロードバランサーがある場合やSSLが他の場所(サーバーではない)に「オフロード」されている場合、これはリダイレクトループになります(SSLはクライアントとフロントエンドネット/ SSLポンドの間、および
http
ボックス( es)/ application)。これは実際には私のプロダクションケースです。
この(localhost-サーバーではなくローカル開発ボックス)要求シーケンスに示されているように、さらにいじくり回すと上記のようになります(上記の問題は、SSL処理が「スタックの上位」にある本番環境の負荷分散環境で発生します-例:ARR):
Request.IsSecureConnection
cert
false
それで、問題は本当にこれを回避する方法についてのガイダンスにありますか?
これを解決しようとして私の「方向」を変えてくれたリチャードに感謝します。私はもともと次の方法を探していました:
安全なURLを(明示的に)使用し、評価方法を「オーバーライド」するようにOWIN / Identityに設定/通知しますLoginPath
。Secure
Cookieを処理する際の(唯一の)オプションは、どういうわけか私をそのように導きました(HTTPSでのみCookieを明示的に言うことができる場合、それはあるLoginPath
意味で、いずれかの方法でそうすることができるという印象を与えました)
私の頭の中の「ハッキー」な方法は、クライアント側(Javascript)に対処することでした。
結局、リチャードの答えは私をURL書き換えに連れて行った(それは私のコントロールを超えているので、まだLB側ではないが)。私は現在(私の環境に基づいて)作業しています:
<rule name="Redirect to HTTPS" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_CLUSTER_HTTPS}" pattern="^on$" negate="true" />
<add input="{HTTP_CLUSTER_HTTPS}" pattern=".+" negate="true" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}{SCRIPT_NAME}/{REQUEST_URI}" redirectType="SeeOther" />
</rule>
トンネルの終わりに光が見えます。
リチャードの探偵に改めて感謝します!最新の回答で私も調査しましたが、CookieApplyRedirectContextに関連するSOに関する投稿がかなりあることがわかりました...これが私の場合に固有のものであり、私が最初に求めていたものです:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
//This is why. If I could explicitly set this, then I (thought) I should
//be able to explicitly enforce https (too..as a setting)
//for the LoginPath...
CookieSecure = CookieSecureOption.Always,
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = .....
,
OnApplyRedirect = context =>
{
Uri absoluteUri;
if (Uri.TryCreate(context.RedirectUri, UriKind.Absolute, out absoluteUri))
{
var path = PathString.FromUriComponent(absoluteUri);
if (path == context.OwinContext.Request.PathBase + context.Options.LoginPath)
{
context.RedirectUri = context.RedirectUri.Replace("http:", "https:");
}
}
context.Response.Redirect(context.RedirectUri);
}
}
});
この問題は、アプリケーションが絶対URLへのリダイレクトを発行しているために発生しています。これは、ロードバランサーまたはアプリケーション自体の2つの方法のいずれかで修正できます。
リダイレクト応答をhttpからhttpsに書き換えるようにロードバランサーを構成します。ARRを使用している場合は、次のルール(ここから取得)が機能するはずです。
<rule name="forum-redirect" preCondition="IsRedirection" enabled="true">
<match serverVariable="RESPONSE_LOCATION" pattern="^http://[^/]+/(.*)" />
<conditions>
<add input="{ORIGINAL_HOST}" pattern=".+" />
</conditions>
<action type="Rewrite" value="http://{ORIGINAL_HOST}/{R:1}" />
</rule>
他のロードバランサーでも同様の構成が必要になります。
OWINが認証プロセスでリダイレクトするURLを相対URLに置き換えることができます。これは、プロトコルが以前にブラウザが使用していたものと同じままであることを意味します。
これを行う方法を見つけるには、Owinソースを少し掘り下げる必要がありましたが、アプリケーションのスタートアップに次の変更を加えると、問題が解決するはずです。まず、スタートアップ構成からCookieAuthenticationProvider初期化を抽出します。
変化する:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
// Move these options in the step below...
}
});
に:
var cookieProvider = new CookieAuthenticationProvider
{
// ... Options from your existing application
};
// Modify redirect behaviour to convert login URL to relative
var applyRedirect = cookieProvider.OnApplyRedirect;
cookieProvider.OnApplyRedirect = context =>
{
if (context.RedirectUri.StartsWith("http://" + context.Request.Host))
{
context.RedirectUri = context.RedirectUri.Substring(
context.RedirectUri.IndexOf('/', "http://".Length));
}
applyRedirect(context);
};
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = cookieProvider
});
リダイレクトルールがどこに設定されているかを簡単に知ることはできませんが、OWINはデリゲートを使用して実際のリダイレクトを実行します。ここで行ったことは、そのデリゲートが保存され、与えられようとしているURLを変更してから、再度呼び出します。
このオプションを使用して、サイト内の他のリダイレクトとリンクが相対的であることを確認してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加