ほとんどのチュートリアルでは、混合モードサイト(HTTPとHTTPSの両方)を使用することで、SSLの目的を無効にすることに同意します(特定のパスでSSLが必要な場合は、SSL以外の接続に切り替えます)。HTTPSに切り替えたら、少なくともユーザーがログアウトするまで、すべてのユーザーにHTTPSを使用し続けるように強制することをお勧めします。HTTPSを使用するサイトが1つあり、サイトにアクセスしたら、URL書き換えルールを使用してユーザーをHTTPSに切り替えるだけで、HTTPSのみが許可されます。
<rewrite>
<rules>
<rule name="Redirect HTTP to HTTPS" stopProcessing="true">
<match url="(.*)"/>
<conditions>
<add input="{HTTPS}" pattern="^OFF$"/>
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="SeeOther"/>
</rule>
</rules>
</rewrite>
これを行ったら、HTTPSも要求するように認証Cookieを設定することもお勧めします。フォーム認証の場合、これはweb.configで次のように設定するのと同じくらい簡単です。
<authentication>
<forms requireSSL="true" />
</authentication>
また、Strict-Transport-Securityを使用してサイトにSSLが必要であることを示すなど、ブラウザーがサイトを正しく処理するのに役立つように設定できるヘッダーのいくつかを確認することをお勧めします。ヘッダーは実行できる優れた補足手段ですが、最終的にはブラウザーが強制するために残されており、排他的に依存するべきではないことに注意してください。
あなたが説明している症状に悩まされることはなく、ログで気付いている問題の解決に役立つことを願っているので、これらの手順をお勧めします。
修正:ああ、私も言及するのを忘れました。HTTPSは、従来のHTTPよりも接続を確立するのに少し集中的です。物事の壮大な計画にはあまりありませんが、それでもそれは何かです。そのオーバーヘッドの一部を減らすために、HTTPキープアライブを利用することをお勧めします。
更新: SSLを介した通信は、認証されていることを意味するものではありません。これは、安全な/暗号化された接続を介して話していることを意味します。
あなたのAmazonの例を見てみましょう。このサイトにアクセスすると、HTTPを介した通常の接続を利用できるようになります。ログインしていません。サイトを閲覧しているだけです。必要に応じて、HTTPSに切り替えることができ、同じサイトを取得できますが、まだログインしていません。これで、ログインしようとすると、HTTPSモニカで示されているように、SSLを介して話すようにリダイレクトされます(まだ行っていない場合)。実際にログインした後でも、SSLを介して通信します。ログイン中にURLのプロトコル部分からSを削除して、SSLを使用しないように手動で切り替えようとしても、HTTPSの使用に戻ります。これが正しい方法です。通常、認証後に暗号化されていないセッションに戻らないことをお勧めします。これは通常、認証CookieがプレーンHTTPを介して送信されることはないため、セッションハイジャックを回避するためです。外部ソースにあるリソースが、信頼できるサイトにあることを確認してください。HTTP接続中の外部リソースアクセスもSSL接続を介して行う必要があります。繰り返しますが、SSLを介して通信するからといって、それらのソースにログインしているわけではありません。私のアプリはSSLを介した100%アクセスですが、サイトにはGoogleアナリティクスとGoogleマップの統合もあります(明らかに両方とも私のドメインの外部にあります)。SSL経由でGoogleと話していることを確認します。これらを使用するために、実際にGoogleにログインする必要はありません。同じことが外部画像にも当てはまります。URLを確認してください」
更新:このようなログで2つのヒットが発生する理由は、ログインリンクがHTTP経由で要求されているためです。最初に、HTTPS属性のヒットが必要であると、SSLを使用していないことが認識され、HTTPSを使用して自分自身にリダイレクトされます。プロトコル。ActionLink URLを更新すると、これを回避できますが、ご存知のとおり、見苦しくなります。
Url.Action("Login", "User", null, "https", Request.Url.Host)