2016-05-03 32 views
0

私たちはユーザーがサインインとサインアウトできるWebサービスを持っています。 Cookieは、ユーザーがサインインしているかどうかを判断するために使用されます。Cookieを正しく期限切れにする方法は?

サービスでは、それぞれがサブドメインで識別される複数の「サイト」が公開されます。たとえば、次のように

  • http://customer1.ourservice.com/
  • http://customer2.ourservice.com/

にサインインするには、2つの方法があります。 「サービス全体」または「サイト固有」のいずれかです。

「サービスワイド」サインインリクエストは特別なサブドメイン(http://globalauth.ourservice.com/)に送信されます。リクエストでこのような記号次のようにSet-Cookieヘッダーにつながる:

Set-Cookie: OUR-COOKIE=<<cookie-value>>; 
      expires=Wed, 03 May 2017 11:25:58 GMT; 
      domain=.ourservice.com; 
      path=/; 
      httponly 

(改行は読みやすくするためにここに追加)

domain=.ourservice.com設定では、すべてのサブドメインにクッキーが利用できるようになります。

「サイト固有の」サインイン要求がサイト固有のサブドメインに送信されます。彼らは、次のようなSet-Cookieヘッダーにつながる:

Set-Cookie: OUR-COOKIE=<<cookie-value>>; 
      expires=Wed, 03 May 2017 11:23:42 GMT; 
      path=/; 
      httponly 

・サインアウト要求は常にサイトの特定のサブドメインに送信され、中に「側の広い」記号との「サイト固有の」看板の両方のためにクッキーを削除することになっています。

看板出て、次のようなSet-Cookieヘッダー内の要求結果:

Set-Cookie: OUR-COOKIE=; 
      expires=Mon, 02 May 2016 11:26:54 GMT; 
      path=/; 
      httponly, 
      OUR-COOKIE=; 
      expires=Mon, 02 May 2016 11:26:54 GMT; 
      domain=.ourservice.com; 
      path=/; 
      httponly 

ここでの考え方は、サイト固有およびサービス全体のCookieの両方がクリアされ、有効期限が切れされなければならないということです。

「サービスワイド」サインインが使用されたときに機能しますが、「サイト固有の」サインインが使用されたときは機能しません。

サイト固有のCookieは、単にブラウザから削除されません。

domainの設定の有無にかかわらず、ブラウザにCookieの期限切れ/削除を正しく指示する方法を教えてください。

答えて

0

これは、.NET Framework 4.0および4.5のWCF関連のバグが原因であることが判明しました。

RFC 6265という仕様では、1つのSet-Cookieヘッダーで複数のカンマ区切りのCookieを送信できません。代わりに複数のSet-Cookieヘッダーを使用する必要があります(各Cookieに1つ)。

私たちはHttpResponseHeadersExtensions.AddCookiesを使用してクッキーを追加しています。そのメソッドのドキュメントは、明らかに言う:

それぞれのSet-Cookieヘッダが CookieHeaderValueインスタンスとして表されます。

しかし、複数CookieHeaderValueインスタンスが実際の仕様によってサポートされていない単一の、カンマで区切られ、Set-Cookieヘッダ–にマージされることが分かります。

はStackOverflowの上で次の関連記事を参照してください:

後者のポストからの引用:

事実 "のSet-Cookie" という単一のクッキーに混乱している行は、Microsoftの.NET Framewoのバグとして記録されますrk 4.0、またFramework 4.5です。 Microsoft WCF開発グループ内では、バグは「閉じた」と「修正されません」と表示されます。

マイクロソフトによると、唯一の回避策は、IIS内の自己ホスト型からホスト型への移行と、(IIS)応答オブジェクトを直接使用することです(バグのない別のコードパス)。

現在、自己ホストコードパスを使用しているため、これは悪いニュースです。このバグを回避する方法を見つける必要があります。

関連する問題