12

ホストを Win2K3/IIS6 から Win2k8R2/IIS7.5 にアップグレードしたところ、IIS サイトから奇妙な反応が返ってきました。ASP.Net バージョン 4.0

次の構成でフォーム認証を使用する非常に複雑で成熟した Web アプリケーションがあります。

<authentication mode="Forms">
  <forms loginUrl="~/Login" timeout="2000" domain="xx.xx.com" requireSSL="true" />
</authentication>

ログイン URL は、SSL 用に適切に構成された ASP.Net MVC 3 ページに誘導します。

サイトは IIS6 で期待どおりに動作しましたが、ホストの移行以降、ログインに成功すると、応答ヘッダーの認証 Cookie に Secure 属性と HttpOnly 属性がありません。多くの HTTP ページを含む混合コンテンツ サイトがあるため、これは問題です。認証 Cookie は、HTTPS を介したリクエストだけでなく、すべてのリクエストで送信されるようになり、セッション盗用の脆弱性にさらされるようになりました。

Logoff リンクは、Secure 属性と HttpOnly 属性を含む長さゼロの Cookie を正常に送信します。

これは、無実の人を保護するために編集された、Fiddler からのログインとログオフに成功した後の生の応答です:)

Login Response:

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: application/json; charset=utf-8
Set-Cookie: .ASPXAUTH=83FCCA...102D; domain=xx.xx.com; path=/
Date: Fri, 25 Jan 2013 22:53:31 GMT
Content-Length: 84

{...}


Logoff Response:

HTTP/1.1 302 Found

Cache-Control: private
Content-Type: text/html; charset=utf-8
Location: http://xx.xx.com/?...
Set-Cookie: .ASPXAUTH=; domain=xx.xx.com; expires=Tue, 12-Oct-1999 04:00:00 GMT; path=/; secure; HttpOnly
Set-Cookie: logoff=; path=/
Set-Cookie: ...
Date: Fri, 25 Jan 2013 22:57:01 GMT
Content-Length: 64053

<html><head><title>...

アプリ プールの統合パイプライン設定を変更しても効果はありません。

Cookie 作成コードの重要な部分は次のとおりです。

    var ctx = HttpContextFactory.Current;

    var cookie = new HttpCookie(
        FormsAuthentication.FormsCookieName,
        FormsAuthentication.Encrypt(
            new FormsAuthenticationTicket(
                SessionId,
                false,
                Convert.ToInt32(FormsAuthentication.Timeout.TotalMinutes)
            )
        )
    ) { Domain = domain };

    ctx.Response.Cookies.Add(cookie);

これを引き起こしている原因をどこから探し始めるかについて何か考えはありますか?

4

1 に答える 1

12

フォーム認証 Cookie を発行する場合、設定するのはドメイン名だけです。安全なフラグをどこにも設定していません。したがって、cookie に secure および httponly フラグを設定する場合は、この cookie を作成するときにそれらを指定したことを確認してください。

var cookie = new HttpCookie(
    FormsAuthentication.FormsCookieName,
    FormsAuthentication.Encrypt(
        new FormsAuthenticationTicket(
            SessionId,
            false,
            Convert.ToInt32(FormsAuthentication.Timeout.TotalMinutes)
        )
    )
) 
{ 
    Domain = domain,
    HttpOnly = true,
    Secure = FormsAuthentication.RequireSSL
};

FormsAuthentication.SetAuthCookieフォーム認証 Cookie を (または組み込みメソッドを使用する代わりに) 手動で作成しているためFormsAuthentication.GetAuthCookie、web.config の設定は効果がありません。私の例に示すように、明示的に設定する必要があります。

于 2013-01-26T17:50:04.697 に答える