Аутентификация с двумя формами в asp.net 2.0 - 4.0

ИСТОРИЯ

У меня два сайта в одном домене. Один веб-сайт включает только функции входа в систему / управления учетной записью, а другой веб-сайт является настоящим веб-сайтом.

  • LoginWeb - анонимный доступ разрешен только в папке Login Page / css / images / javascript.
  • AdminWebsite - полностью заблокирован через формы авторизации. то есть даже в папках javascript / images / css нет <authorization><allow users=*>


ЧТО Я ПЫТАЮСЬ ДОСТИГНУТЬ
Это рабочий процесс, которого я пытаюсь достичь и выполнил на 99%:

  1. Если пользователь попадает на любую страницу AdminWeb, он отправляется обратно в LoginWeb с помощью FormsAuthentication.
  2. Пользователь предоставляет учетные данные на странице входа, и веб-сайт LoginWeb выдает билет для авторизации форм. Пользователь еще не вошел в AdminWebSite. (Таким образом, пользователь может перейти на страницу изменения пароля и т. Д. И выполнить функции управления учетной записью)
  3. Пользователь выполняет еще два шага в LoginWeb, и теперь ему может быть выдан билет FormsAuth для AdminWeb и перенаправлен на него.

99% УЖЕ РАБОТАЕТ
Это код в LoginWeb, который пытается выдать билет FormsAuth для AdminWeb, но он не работает. То есть AdminWeb все еще перенаправляет меня обратно в Login. Я уверен, что мне не хватает чего-то очень тривиального, но я не могу понять, что именно ?????????

public void SetAuthenticationTicket(string username)
{
    MachineKeySection sec=(MachineKeySection)WebConfigurationManager.OpenWebConfiguration("").SectionGroups["system.web"].Sections["machineKey"]; 
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
        username,
        DateTime.Now,
        DateTime.Now.AddMinutes(30),
        false, //true or false
        sec.DecryptionKey, //Custom data like your webkey can go here
        FormsAuthentication.FormsCookiePath);

    var encryptedTicket = FormsAuthentication.Encrypt(ticket);
    var cookie = new HttpCookie("ADMINWEB", encryptedTicket)
    {
        Path = FormsAuthentication.FormsCookiePath,
        Domain = "xxx.com"
    };
    Response.AppendCookie(cookie);
}

Это мои разделы web.config для аутентификации с помощью форм:
LoginWeb

  <machineKey validationKey="XXXXXX" decryptionKey="XXX" validation="SHA1"/>
  <authentication mode="Forms">
    <forms name="LoginWeb"
            domain="xxx.com"
            loginUrl="~/account/Logon"
            timeout="1440"
            cookieless="UseCookies"
            slidingExpiration="false"
            protection="All"
            path="/"/>
  </authentication>


AdminWebSite

   <machineKey validationKey="XXXXXX" decryptionKey="XXX" validation="SHA1"/>
  <authentication mode="Forms">
    <forms name="ADMINWEB"
            domain="xxx.com"
            loginUrl="http://loginweb/account/Logon"
            timeout="1440"
            cookieless="UseCookies"
            slidingExpiration="false"
            protection="All"
            path="/"/>
</authentication>
<authorization>
    <deny users="?"/>
</authorization>

person StackThis    schedule 29.05.2012    source источник
comment
Это под ключ и др ... Очень интересная штука. Вопреки здравому смыслу, если я удалю строку Domain = xxx.com в функции SetAuthenticationTicket (), она волшебным образом начнет работать. Однако я тестирую это на localhost, так что это может быть как-то связано с этим, но это вообще не имеет смысла.   -  person StackThis    schedule 30.05.2012
comment
Это может быть ключом, поскольку клиент localhost будет запрашивать билеты для домена localhost из браузера. Может быть, сравните его с билетом, созданным для LOGINWEB.   -  person Turnkey    schedule 30.05.2012


Ответы (1)


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

person Turnkey    schedule 30.05.2012
comment
Я думаю, вы неправильно поняли, чего я пытаюсь достичь. Оба сайта уже работают нормально, используя Forms Auth (т.е. используя одно и то же имя в элементе форм, как вы говорите. Но я пытаюсь НЕ ДЕЛАТЬ ЭТОГО. Т.е. мне нужны отдельные формы auth cookie / ticket для LoginWeb и отдельный файл для AdminWeb. Но LoginWeb также должен иметь возможность выдавать билет для AdminWeb. (См. Функцию SetAuthenticationTicket () выше). Это та, которая выдает билет для AdminWeb с тем же именем формы. - person StackThis; 30.05.2012
comment
Извините за путаницу по этому поводу. Я не уверен, что это можно сделать без специального кода единого входа. - person Turnkey; 30.05.2012