Вопрос

У меня есть основное приложение asp.net, написанное на asp.net 1.1.Под приложением работает несколько приложений версии 2.0.Чтобы полностью выйти из системы, могу ли я просто выйти из приложения 1.1 с помощью FormsAuthentication.SignOut или это сложнее?

Это было полезно?

Решение

То, что вы хотите сделать, называется «Единый вход» и «Единый выход».Существуют различия в зависимости от того, как настроены приложения.Я попытаюсь прояснить, где эти различия вступают в игру.

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

<authentication mode="Forms">
    <forms name=".cookiename"
           loginUrl="~/Login.aspx" 
           timeout="30" 
           path="/" />
</authentication>

Затем вам нужно добавить машинные ключи, и они должны быть одинаковыми во всех ваших приложениях.

<machineKey validationKey="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902"
            encryptionKey="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902F8D923AC"
            validation="SHA1" />

Используете ли вы для своих приложений домены второго или третьего уровня?В этом случае вам нужно будет сделать еще немного, добавив домен в файл cookie:

protected void Login(string userName, string password)
{
    System.Web.HttpCookie cookie = FormsAuthentication.GetAuthCookie(userName, False);
    cookie.Domain = "domain1.com";
    cookie.Expires = DateTime.Now.AddDays(30);
    Response.AppendCookie(cookie);
}

Теперь, чтобы выполнить единый выход, вызова FormsAuthentication.SignOut может быть недостаточно.Следующий лучший вариант — установить срок действия файлов cookie на прошедшую дату.Это гарантирует, что файл cookie больше не будет использоваться для аутентификации.

protected void Logout(string userName)
{
    System.Web.HttpCookie cookie = FormsAuthentication.GetAuthCookie(userName, False);
    cookie.Domain = "domain1.com";
    cookie.Expires = DateTime.Now.AddDays(-1);
    Response.AppendCookie(cookie);
}

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

Другие советы

Было бы проще, если бы у вас было центральное хранилище сеансов для всех ваших приложений.Затем вы можете установить для сеанса значение null в одном месте.

Это сработало для меня:

В событии выхода из системы вместо метода FormsAuthentication.GetAuthCookie используйте коллекцию файлов cookie в объекте запроса, как показано ниже:

HttpCookie cookie = Request.Cookies.Get(otherSiteCookieName);
cookie.Expires = DateTime.Now.AddDays(-1);
HttpContext.Current.Response.Cookies.Add(cookie);

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

Я предпочитаю использовать web.config

<authentication mode="Forms">
    <forms domain=".tv.loc" loginUrl="~/signin" timeout="2880" name="auth" />
</authentication>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top