Как делиться cookie между доменом и субдоменом, но не другими подобластями

В нашем веб-приложении ASP.NET MVC есть несколько разных поддоменов, которые мы используем для тестирования и устаревшего кода. Поддомены:

  • www.sitename.com(производственная площадка)
  • test.sitename.com(тестирование)
  • original.sitename.com(устаревший код)
  • staging.sitename.com(время от времени используется для тестирования прямо перед развертыванием)

Мы целенаправленно используем аутентификацию форм, не использующих cookie уровня домена, потому что мы хотим, чтобы файлы cookie были уникальными в этих разных поддоменах. Проблема в том, что когда люди получают ссылку на корневой домен (sitename.com), для этого требуется, чтобы они снова вошли в систему, чтобы получить файл cookie, даже если они уже вошли в систему на www.sitename.com.

Есть ли способ поделиться файлом cookie между только www.sitename.com и sitename.com без влияния других поддоменов?

Ответ 1

Я бы порекомендовал принудительное использование www. версия сайта, по этой причине, среди прочего, этот сайт имеет отличные причины, почему...

http://www.yes-www.org/why-use-www/

Для этого в .net вы можете добавить следующее в ваш web.config

<system.webServer>
  <rewrite>
    <rules>
      <rule name="Redirect to www" stopProcessing="true">
        <match url="(.*)" />
        <conditions trackAllCaptures="false">
        <add input="{HTTP_HOST}" pattern="^sitename.com$" />
        </conditions>
        <action type="Redirect" url="{MapProtocol:{HTTPS}}://www.{HTTP_HOST}{HTTP_URL}" redirectType="Permanent"/>
      </rule>
    </rules>
    <rewriteMaps>
      <rewriteMap name="MapProtocol">
        <add key="on" value="https" />
        <add key="off" value="http" />
      </rewriteMap>
    </rewriteMaps>
  </rewrite>
</system.webServer>

Это будет автоматически перенаправлять навсегда (см. Добавление redirectType = "Permanent") для URL, не относящихся к www, к эквиваленту www и сохранит протокол HTTP (s).

Часть trackAllCaptures связана с сопоставлением с регулярным выражением - в нашем случае нам не нужно ничего захватывать; нам нужно только соответствовать правилу, поэтому мы можем оставить значение false.

Шаблон регулярного выражения ^ sitename.com $ будет соответствовать, когда имя хоста точно совпадает с "sitename.com" - ^ означает начальную позицию, а $ означает конечную позицию

Карта переписывания взята из идеи Джеффа Грейвса, которую я считаю, http://jeffgraves.me/2012/11/06/maintain-protocol-in-url-rewrite-rules/

Способ, который я показал, показывает только один способ сделать это, как и в большинстве случаев - есть несколько способов достижения этого.

У Скотта Форсайта есть статья о другом способе достижения этой цели (также ссылается на Джеффа Грейвса) http://weblogs.asp.net/owscott/url-rewrite-protocol-http-https-in-the-action

Ответ 2

Вы можете избежать этой проблемы, перенаправив свой домен без www на www с модулем UrlRewrite в > IIS7

переписать правило для размещения в web.config

<system.webServer>
<rewrite>
    <rules>
      <rule name="Redirect to WWW" stopProcessing="true">
        <match url=".*" />
        <conditions>
          <add input="{HTTP_HOST}" pattern="^example.com$" />
        </conditions>
        <action type="Redirect" url="http://www.example.com/{R:0}"
             redirectType="Permanent" />
      </rule>
        </rules>
    </rewrite>
</system.webServer> 

Ответ 3

Вы можете использовать что-то вроде

sessionCookie.Domain = ".yourdomain.com" ;

тогда вы сможете запросить одинаковые файлы cookie из любого поддомена и отредактировать его, если хотите.