2013-10-03 4 views
39

Для проверки подлинности форм я использовал это в web.config (обратите внимание на атрибут домена):ASP.NET Идентичность Cookie субдоменов

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="2880" name=".ASPXAUTH" protection="Validation" path="/" domain=".myserver.dev" /> 
</authentication> 

Как это единый вход субдоменов, сконфигурированных для новой ASP.NET Идентичность в Mvc 5?

Дополнительная информация:

Я создаю приложение Многоквартирное. Каждый клиент будет на подобласти:

client1.myapp.com

client2.myapp.com

Я хочу, чтобы пользователь мог подписать на client1.myapp.com, а затем перейти к client2.myapp.com и по-прежнему . Это было легко с проверкой подлинности форм. Я пытаюсь выяснить, как это сделать с помощью новой Identity Framework.

EDIT

Вот код, который в конечном счете работал для меня:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AuthenticationType = "Application", 
    LoginPath = "/Account/Login", 
    CookieDomain = ".myapp.com" 
}); 
+0

У вас есть одно приложение для всех поддоменов или одно приложение для каждого поддомена? У меня есть второй вариант, и он не работает :( – Ellbar

+0

Можем ли мы получить доступ к «CookieAuthenticationOptions» из других мест приложения? То есть, мы можем изменить его в 'HomeController', чтобы установить время ожидания сеанса? –

+0

Я просто хотел сказать, это на ** localhost **, это может не сработать.Я потрачу два часа, чтобы показать, почему он не работал, но я не мог. И тогда я просто хочу попробовать этот ответ на сервере, и он просто сработал. – Iren

ответ

32

В Startup.Auth.cs, вы увидите что-то вроде:

для RC:

app.UseSignInCookies(); 

Это было удалено в RTM и заменено явной конфигурацией файла cookie:

app.UseCookieAuthentication(new CookieAuthenticationOptions { 
     AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
     LoginPath = new PathString("/Account/Login") 
    }); 

Класс CookieAuthenticationOptions обладает свойством CookieDomain, которым вы ищите, на мой взгляд.

+0

Какая сборка является DefaultAuthenticationTypes класс найден? Это не решение для меня. – orourkedd

+0

Он был добавлен в RTM внутри Identity.Core, если вы используете RC-бит, вы можете установить его в «Приложение». –

+0

@Hao Kung, у меня есть два вопроса: 1) кажется, что только если веб-сайты разных поддоменов используют один и тот же пул приложений в IIS, они могут иметь один знак. Однако, если они используют другой AppPool, он не работает. 2) Это решение единственного знака работает только для кросс-SUB-домена, как справляться с ситуацией перекрестного домена? Большое спасибо! – Chance

12

Вам необходимо настроить в web.config ту же самую машинуKey для ВСЕХ веб-сайтов/приложений.

Все веб-сайты ДОЛЖНЫ ИМЕТЬ хотя бы эту конфигурацию.

http://msdn.microsoft.com/en-us/library/w8h3skw9(v=vs.85).aspx

<system.web> 
    <authentication mode="Forms"> 
     <forms loginUrl="~/Account/Login" timeout="2880" name=".ASPXAUTH" protection="Validation" path="/" domain=".myserver.dev" /> 
    </authentication> 
    <machineKey validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" validation="SHA1" decryption="Auto"/> 
    </system.web> 

Это пример

+2

Проблема в том, что я не использую проверку подлинности форм. Я использую ASP.NET Identity Framework с аутентификацией сеанса – orourkedd

13

Это сводит меня с ума, пока я не узнал, что Идентичность 2,0 все еще зависит от ключа машины для шифрования куки аутентификации. Поэтому, если вам нужны два экземпляра одного и того же приложения в разных поддоменах, вам необходимо установить один и тот же машинный ключ для каждого приложения.

Так что в итоге:

  1. CookieDomain =».myapp.ком»
  2. Установить одинаковые ключи машины в веб-конфигурации каждого приложения

    <system.web> 
        <machineKey decryptionKey="EEEB09D446CCFE71B82631D37DEDCC917B8CB01EC315" validationKey="60E4EFE8DD26C4BF8CDAEDCA10716C85820839A207C56C8140DB7E32BE04630AD631EDF25C748D0F539918283C5858AF456DBE208320CFFA69244B4E589" /> 
    </system.web> 
    

Этот ответ привел меня к установке значения: Does ASP.NET Identity 2 use machinekey to hash the password?

+2

Я испытал то же самое. Файл cookie сеанса шифруется с помощью машинного ключа, поэтому разные приложения, совместно использующие один и тот же файл cookie, должны иметь один и тот же ключ, чтобы иметь возможность расшифровать его. – Arjen

11

В файле Startup.Auth.cs, добавьте параметр CookieDomain в вашем домене:

var cookieAuthenticationOptions = new CookieAuthenticationOptions 
{ 
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
    LoginPath   = new PathString("/Account/Login"), 
    CookieDomain  = ".mydomain.com" 
}; 

T Для всех веб-сайтов вам нужно установить уникальный машинный ключ. Самый простой способ создания нового использует IIS:

Найти опцию «Machine Key» на вашем сайте:

enter image description here

Нажмите кнопку «Сформировать Ключи», чтобы получить ключи.

enter image description here

Наконец, вышеописанный процесс будет добавить следующую строку в ваш web.config и вы должны убедиться, что копируется в каждый из ваших сайтов.

<machineKey 
    validationKey="DAD9E2B0F9..." 
    decryptionKey="ADD1C39C02..." 
    validation="SHA1" 
    decryption="AES" 
/> 
Смежные вопросы