2

SSLを混在させたWebアプリケーション(asp.net 3.5)があります。すべてのアカウント関連のページはSSLで配信されます。ほとんどの場合、他のすべてのページは非SSLで配信されます。 HTTPSとHTTPを自動的に切り替えるには、this componentを使用します。最近、セキュリティで保護されていないWifiネットワーク上でユーザーセッションをハイジャックする機能に関するニュース項目がありました。これは、非SSL接続経由で送信されるCookieをキャッチすることで可能になります。asp.netはrequireSSLを使用し、非SSLページでユーザーが認証されているかどうかを確認することができます

これにより、このWebアプリケーションでセキュリティの選択肢を確認できました。私は(再度)this articleをMSDNから手に入れて、requireSSL = trueプロパティを私のFormsauthenticationに試しました。 Webアプリケーションを起動する前に、この情報を含むCookieがWebブラウザとの間で送受信されないため、非SSLページでUser.Identityがnullになることがわかりました。

私は、SSL接続でユーザーを認証するメカニズムが必要です。非SSLページであっても、この認証情報を覚えています。

SOを検索しているうちに、this postが見つかりました。これは良い解決策だと私には思われます。しかし、Sessionstateにログイン情報を保存する際に解決策が見つかるのだろうか?私はGlobal.asaxでApplication_AuthenticateRequestをキャッチすることを考えています。接続が安全かどうかを確認し、authcookieまたはSessionをチェックします。私はこれをまだどのように実装するのか正確にはわかりません。多分あなたは私と一緒にこれについて考えることができますか?

答えて

3

残念ながら、あなたには矛盾する要件があります。 SSL以外のセキュリティで保護されたセッションを確立することはできないため、私はあなたの根本的な前提に挑戦したいと思います。なぜサイト全体でSSLを使用しないのですか?

+0

こんにちはブラッド、ご返信ありがとうございます。 httpとhttpsを混ぜる理由は2つあります。第1に、画像も電子メールメッセージに配信されるアプリケーションです。 HTML電子メールメッセージで使用されるイメージは、互換性の問題によりHTTPS経由で送信されない方が適しています。また、非SSL接続を介してこれらの画像を提供するため、アプリケーションに混在コンテンツを許可するかどうかを尋ねるポップアップがアプリケーション内に表示されます。メッセージされた電子メールのこれらの同じ画像は、アプリケーション内で使用されます。 – JonHendrix

+0

第2に、資産(CSS、JS、画像など)はSSL経由で配信されるときにキャッシュされません。つまり、毎回のリクエストが毎回多くのアセットを送信します。これは若干の再調整と最適化を行うことで解決することができますが、ほとんどのリソースをキャッシュすると、アプリケーションが応答してよりうまく動作すると思います。 – JonHendrix

+0

私は実際にはアセットではなくアプリケーション自体について話しています。 SSLと非SSLの両方でイメージを提供できることは大きな問題ではありません。サービスされているSSL以外のイメージでは、電子メールメッセージに埋め込まれているため、認証する必要がないと推定されます、私は彼らがないと推測している)。 –

2

SSLを使用しないという属性を要求するMVC FAQ(同様の質問はセキュリティ担当者Leviによって回答されました)から。

•コントローラタイプまたはアクションメソッドで[RequireHttps]属性を使用すると、「これはSSL経由でしかアクセスできません」と言うことができます。コントローラーまたはアクションに対する非SSL要求は、SSLバージョン(HTTP GETの場合)または拒否(HTTP POSTの場合)にリダイレクトされます。 RequireHttpsAttributeをオーバーライドして、必要に応じてこの動作を変更できます。これとは逆の[RequireHttp]属性は内蔵されていませんが、必要に応じて簡単に独自の属性を作成することができます。

プロトコルパラメータをとるHtml.ActionLink()のオーバーロードもあります。明示的に "http"または "https"をプロトコルとして指定することができます。このようなオーバーロードに関するMSDNのドキュメントは次のとおりです。プロトコルを指定しない場合、またはプロトコルパラメータを持たないオーバーロードを呼び出す場合は、リンクに現在の要求と同じプロトコルを使用することを前提としています。

MVCに[RequireHttp]属性がない理由は、それほど多くのメリットがないからです。これは[RequireHttps]ほど面白くないので、ユーザーに間違ったことをさせることになります。たとえば、多くのWebサイトはSSL経由でログインし、ログインした後にHTTPにリダイレクトしますが、これは絶対に間違ったことです。あなたのログインクッキーは、あなたのユーザ名+パスワードと同じくらい秘密です。そして今、あなたはそれを平文で送信します。さらに、MVSパイプラインが実行される前に、ハンドシェイクを実行してチャネル(HTTPSをHTTPよりも遅くするものの大部分)を確保するための時間を既に取っているため、[RequireHttp]は現在の要求または将来を行いません要求はずっと速くなります。

関連する問題