Файлы cookie с единой регистрацией в домене ASP.NET - PullRequest
2 голосов
/ 29 октября 2010

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

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

1) Оба приложения реализованы с использованием ASP.NET MVC2

2) В нашей тестовой среде оба веб-сайта находятся на одном сервере, при этом разные веб-сайты в IIS и заголовки узлов используются для обслуживания двух веб-приложений. В производстве сайты находятся на разных серверах, которые географически разделены. Они используют одни и те же субдомены.

3) Оба сайта имеют настройку SSL и доступны через https; это делается как в тестовой, так и в производственной среде с использованием одного и того же самозаверяющего сертификата подстановочного знака.

4) Пользователи авторизуются на сайте site1, а затем приложение автоматически получает данные с сайта2 с использованием AJAX и JSONP.

5) если сайтами являются site1.example.com и site2.example.com, ниже перечислены важные части файла web.config, совместно используемого для site1 и site2:

...
<authentication mode="Forms">
  <forms name=".myapp" domain=".example.com" slidingExpiration="true" loginUrl="~/Account/LogOn" timeout="30"/>
</authentication>
...
<machineKey validationKey="KEY1..." decryptionKey="KEY2..."
  validation="SHA1" decryption="AES" />
...

ПРИМЕЧАНИЕ. Одна вещь, которая меня удивляет в отношении вышеприведенного материала, заключается в том, что билет аутентификации шифруется \ хэшируется таким образом, что его можно расшифровать только на одном сервере? Это объяснило бы мою проблему; но если это так, как я могу гарантировать, что сервер для site1 и site2 сможет расшифровать мой файл cookie аутентификации? KEY1 и KEY2 однозначно одинаковы на обоих сайтах \ серверах.

6) На сайте 1 роли, в которых находится пользователь, также вставляются в файл cookie с использованием следующего:

public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl)
    {
        if (!ValidateLogOn(userName, password))
        {
            ViewData["rememberMe"] = rememberMe;
            return View(new SiteViewModel(this));
        }

        FormsAuth.SignIn(userName, rememberMe);

        // Add roles to cookie
        string[] roles = Roles.GetRolesForUser(userName);
        HttpCookie cookie = FormsAuthentication.GetAuthCookie(User.Identity.Name, rememberMe);
        FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
        // Store roles inside the Forms cookie.  
        FormsAuthenticationTicket newticket = new FormsAuthenticationTicket(ticket.Version, userName,
            ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, String.Join("|", roles), ticket.CookiePath);
        cookie.Value = FormsAuthentication.Encrypt(newticket);
        cookie.HttpOnly = false;
        Response.Cookies.Remove(cookie.Name);
        Response.AppendCookie(cookie);

        if (!String.IsNullOrEmpty(returnUrl))
        {
            return Redirect(returnUrl);
        }
        return RedirectToAction("Index", "Home");
    }

7) Роли восстанавливаются на Сайте 2 с использованием следующего:

        protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
        if (Context.Request.IsAuthenticated)
        {
            FormsIdentity ident = (FormsIdentity)Context.User.Identity;
            string[] arrRoles = ident.Ticket.UserData.Split(new[] { '|' });
            Context.User = new System.Security.Principal.GenericPrincipal(ident, arrRoles);
        }
    }

EDIT:

8) Это распечатка сборок, на которые ссылаются приложения на обоих серверах:

        mscorlib: 2.0.0.0
    System: 2.0.0.0
        System.Configuration: 2.0.0.0
            System.Xml: 2.0.0.0
    System.ComponentModel.DataAnnotations: 3.5.0.0
        System.Core: 3.5.0.0
    System.Data: 2.0.0.0
        System.EnterpriseServices: 2.0.0.0
            System.Transactions: 2.0.0.0
    System.Data.Entity: 3.5.0.0
        System.Runtime.Serialization: 3.0.0.0
            SMDiagnostics: 3.0.0.0
    System.Web: 2.0.0.0
        System.Drawing: 2.0.0.0
        System.Web.RegularExpressions: 2.0.0.0
        System.Web.Services: 2.0.0.0
    System.Web.Abstractions: 3.5.0.0
    System.Web.Extensions: 3.5.0.0
        System.Data.Linq: 3.5.0.0
            System.Xml.Linq: 3.5.0.0
        System.ServiceModel: 3.0.0.0
            System.IdentityModel: 3.0.0.0
        System.ServiceModel.Web: 3.5.0.0
    System.Web.Mvc: 1.0.0.0
        System.Web.Routing: 3.5.0.0
    xVal: 1.0.0.0

1 Ответ

4 голосов
/ 29 октября 2010

Да.Шифрование зависит от сервера.Или, если быть более точным, полагается, что машинный ключ совпадает.

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

Если он не работает после полного удаления защиты / шифрования, он не имеет ничего общего с несовместимым шифрованием.Дайте нам знать.

ОБНОВЛЕНИЕ Это извлечено из нашего web.config.После удаления специфики сайта конечно.Попробуйте указать все явно, особенно path :

<forms name=".ASPNET" protection="All" loginUrl="~/Account/LogOn" timeout="2880"
        path="/" domain=".example.com"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...