1

web.api によって生成されるすべての Cookie の HttpOnly および Secure フラグを変更する必要があります。

これを行うために、web.api からのすべての応答を変更するグローバル フィルターを追加しました。PreSendRequestHeaders イベントを使用して IIS でこれを行うコードが既にありますが、セルフ ホスティングでは機能しません。

変更する必要がある Cookie は、セッション認証 Cookie とフォーム認証 Cookie です。httponly フラグは主な問題ではありません。SSL オフロードを行う際に問題になるのは secure フラグであるため、自動的にセキュアに設定されません。

HttpResponseHeadersExtensions を使用して Cookie を追加できますが、既存の Cookie を更新するものは何も表示されません。

set-cookie ヘッダーを手動で解析することを避けたい。これを達成するための最良の方法は何ですか?

(これはセルフホストと IIS で動作する必要があるため、HttpContext.Current は使用できません)

4

1 に答える 1

1

Cookie が ApiController 自体によって設定されているとします。任意のコンポーネントである可能性がありますが、次のようにコントローラーがそれを行うと言います。

public HttpResponseMessage Get(int id)
{
    var cookie = new CookieHeaderValue("abc", "12345");
    cookie.Path = "/";

    var response = Request.CreateResponse();
    response.Headers.AddCookies(new CookieHeaderValue[] { cookie });
    return response;
}

ここでも、Cookie は FormsAuth を含む任意の Cookie にすることができます。しかし、私は通常のクッキーを使用しています。メッセージ ハンドラーがある場合は、次のように、HttpOnly を作成し、同じキーで Cookie を保護するだけです。

public class MyHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(
                                    HttpRequestMessage request,
                                          CancellationToken cancellationToken)
    {
        var response = await base.SendAsync(request, cancellationToken);

        var cookie = new CookieHeaderValue("abc", "12345");
        cookie.Secure = true;
        cookie.HttpOnly = true;
        cookie.Path = "/";

        response.Headers.AddCookies(new CookieHeaderValue[] { cookie });

        return response;
    }
}

このようにしてクライアントに送り返される Cookie は、安全な HttpOnly Cookie になります。

于 2013-05-14T17:40:52.850 に答える