3

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

ответ

5

То, что вы ищете, называется Single Sign On и Single Sign Off. Существуют различия, основанные на настройке приложений. Я попытаюсь уточнить, где эти различия вступают в игру.

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

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

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

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

Вы используете домены второго или третьего уровня для приложений? Если так что вам нужно будет сделать немного больше, добавив домен куки:

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); 
} 

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

+0

«Теперь, чтобы сделать единый вход выключен, вызов FormsAuthentication.SignOut не может быть достаточно» Вы можете указать, почему это не было бы достаточно? – 2016-06-16 12:47:27

0

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

0

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

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

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

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

0

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

<authentication mode="Forms"> 
    <forms domain=".tv.loc" loginUrl="~/signin" timeout="2880" name="auth" /> 
</authentication>