Проблема проверки подлинности форм в ASP.NET

Я использую Visual Studio Team System 2008 (VSTS), C #, .NET 3.5, IIS 7.0 и ASP.NET. У меня есть два веб-сайта IIS, сайт A и сайт B. Их связанные доменные имена: http://sitea.example.com и http://siteb.example.com.

Я слышал, что при использовании аутентификации формы мы могли бы включить файлы cookie на уровне домена, то есть, если два сайта находятся в одном домене (например, оба sitea.example.com и siteb.example.com находятся в домене example.com), конечному пользователю необходимо пройти аутентификацию только один раз. Более подробно, если пользователь аутентифицирован (прошел аутентификацию) на одном из сайтов, нет необходимости повторно аутентифицировать пользователя на других сайтах.

Как включить эту функцию для моих sitea и siteb? Нужно ли мне изменять web.config как для sitea, так и для siteb?

Другая путаница заключается в том, что если пользователь аутентифицирован sitea, он уверен, что личность пользователя распознается sitea, но как siteb может распознать личность пользователя без повторной аутентификации пользователя?


person George2    schedule 14.09.2009    source источник


Ответы (5)


Предполагая, что оба сайта используют одну и ту же базу данных членства, вы можете установить домен cookie в формах раздел аутентификации web.config;

<authentication mode="Forms">
    <forms .... domain="mycorp.com"/>
</authentication>

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

person blowdart    schedule 14.09.2009
comment
1. Должны ли оба веб-сайта использовать один и тот же машинный ключ? 2. Другая проблема заключается в том, что я не использую встроенный поставщик базы данных для проверки подлинности с помощью форм, я использую настраиваемый метод проверки подлинности (я помещаю свой настраиваемый метод проверки подлинности в библиотеку DLL и раскрываю метод проверки подлинности, если проверка подлинности прошла успешно, я установлю аутентификация проходит cookie.) Я не уверен, использую ли я такой настраиваемый метод аутентификации, я все еще могу использовать cookie уровня домена для аутентификации с помощью форм? - person George2; 14.09.2009
comment
1. Да. 2. Если вы используете cookie проверки подлинности форм, обязательно. Если вы используете свой собственный файл cookie и задаете домен для файла cookie, он будет работать должным образом. - person blowdart; 14.09.2009
comment
Использование cookie аутентификации означает что-то вроде этого - Dim C As System.Web.HttpCookie = _ Request.Cookies (System.Web.Security.FormsAuthentication.FormsCookieName) C.Domain = example.com C.Expires = DateTime.Now.AddDays (-1) Response.Cookies.Add (C) - person George2; 14.09.2009
comment
Меня интересует, если вы используете свой собственный файл cookie и устанавливаете домен для файла cookie, он будет работать, как ожидалось, не могли бы вы показать мне, как установить произвольный файл cookie приложения (не обязательно использовать файл cookie проверки подлинности с помощью форм) для всего домена, пожалуйста ? - person George2; 14.09.2009
comment
Я бы предположил, что это заслуживает отдельного вопроса, чтобы другие люди могли его найти - msdn.microsoft.com/en-us/library/ms178194.aspx содержит подробную информацию. И да, для форм auth cookie, вот так. За исключением случаев, когда срок годности истекает в прошлом - этот файл cookie никогда не будет работать! - person blowdart; 14.09.2009

В MSDN есть пример .

person Henk Holterman    schedule 14.09.2009
comment
Другая проблема заключается в том, что я не использую встроенный поставщик базы данных для проверки подлинности с помощью форм, я использую настраиваемый метод проверки подлинности (я помещаю свой настраиваемый метод проверки подлинности в библиотеку DLL и раскрываю метод проверки подлинности, если проверка подлинности прошла, я установлю проход проверки подлинности cookie.) Я не уверен, что использую такой настраиваемый метод аутентификации, могу ли я использовать cookie на уровне домена для аутентификации с помощью форм? - person George2; 14.09.2009
comment
Если вы устанавливаете cookie самостоятельно, я в этом сомневаюсь. Вы можете использовать своего собственного провайдера, но когда пользователь входит в систему, вы должны вызвать FormsAuthentication.RedirectFromLoginPage () - person Henk Holterman; 14.09.2009
comment
Спасибо! Если мой код выглядит так, мне интересно, является ли это файлом cookie форм? Dim C как System.Web.HttpCookie = _ Request.Cookies (System.Web.Security.FormsAuthentication.FormsCookieName) C.Domain = example.com C.Expires = DateTime.Now.AddDays (-1) Response.Cookies.Add ( C) - person George2; 14.09.2009
comment
George2, это похоже на ручную манипуляцию с файлом cookie форм. Избегайте, если возможно, но, возможно, это сработает. - person Henk Holterman; 14.09.2009

Эта ссылка дает некоторые подробности http://docs.communityserver.com/2007/270-common-things-to-check-when-using-forms-authentication/

Обычно вам нужно добавить атрибут домена в тег <forms/> внутри тега <authentication> файла web.config.

e.g.

<authentication mode="Forms">
<forms name=".CookieName" ... domain=".mydomain.com" />
</authentication>
person Jonathan Parker    schedule 14.09.2009
comment
Другая проблема заключается в том, что я не использую встроенный поставщик базы данных для проверки подлинности с помощью форм, я использую настраиваемый метод проверки подлинности (я помещаю свой настраиваемый метод проверки подлинности в библиотеку DLL и раскрываю метод проверки подлинности, если проверка подлинности прошла, я установлю проход проверки подлинности cookie.) Я не уверен, что использую такой настраиваемый метод аутентификации, могу ли я использовать cookie на уровне домена для аутентификации с помощью форм? - person George2; 14.09.2009

Установите для атрибута домена значение .mycorp.com в теге формы в web.config

person Chuck Conway    schedule 14.09.2009
comment
Другая проблема заключается в том, что я не использую встроенный поставщик базы данных для проверки подлинности с помощью форм, я использую настраиваемый метод проверки подлинности (я помещаю свой настраиваемый метод проверки подлинности в библиотеку DLL и раскрываю метод проверки подлинности, если проверка подлинности прошла, я установлю проход проверки подлинности cookie.) Я не уверен, что использую такой настраиваемый метод аутентификации, могу ли я использовать cookie на уровне домена для аутентификации с помощью форм? - person George2; 14.09.2009

Я бы предложил способ Stack Overflow, Microsoft, Facebook, Google Accounts, и это даже более эффективно, потому что каждый веб-сайт может находиться на любых разных машинах.

Предположим, у вас есть AuthSite. Это единственный сайт, на котором вы должны войти в систему и получить информацию о членстве.

И у вас есть SiteA, SiteB и SiteC на разных серверах.

На странице входа в SiteA вы должны настроить сообщение формы с секретом на AuthSite.

Если вы ранее успешно вошли на AuthSite, он просто перенаправит вас обратно на SiteA с успешным секретом в виде скрытой публикации формы в браузере, которую вы должны подтвердить на SiteA.

Эта модель очень расширяема и масштабируема. Потому что поддерживать в долгосрочной перспективе несложно.

Код на странице входа в систему на SiteA, SiteB и SiteC приведен ниже.

Login.aspx на SiteA, SiteB и SiteC:

private void Page_Load(object sender, EventArg e){
   // Simply redirect back to AuthSite...
   // Change Site parameter accordingly.
   Response.Redirect("http://authsite/Login.aspx?Site=SiteA");
}

Login.aspx на AuthSite:

// Define one hidden field named "ReturnSite".

private void Page_Load(object sender, EventArg e){

   if(IsPostBack)
       return;
   string site = Request.QueryString["Site"];
   if(Request.User.IsAuthenticated){
       string secrete = CreateSomeSecrete(site);
       Response.Redirect("http://" + site + 
           "/AuthConfirm.aspx?Token=" + secrete + 
           "&User=" + Request.User.Identity.Name);
       return;
   }

   ReturnSite.value = site;
   // Do usual login...
}

private void LoginButton_Click(object sender, EventArg e){
   string secrete = CreateSomeSecrete(ReturnSite.value);
   FormAuthentication.SetAuthCookie(username,true);
   // You can retrive username later by calling 
   // Request.User.Identity.Name.
   Response.Redirect("http://" + ReturnSite.value + 
      "/AuthConfirm.aspx?Token=" + secrete + "&User=" + username);
}

AuthConfirm.aspx на SiteA, SiteB и SiteC:

private void Page_Load(object sender, EventArg e){
   string secrete = Request.QueryString["Token"];
   // Verify that secret came only from AuthSite.
   if(VerifySecrete(secrete)){
       // This sets authentication cookie for Current Site
       FormsAuthentication.SetAuthCookie(Request.QueryString["User"], true);
   }
}

Теперь посмотрим другой сценарий.

Тот же пользователь, первый вход

  1. Первый пользователь, Джон, посещающий SiteA (еще не вошедший в систему), перенаправляется на AuthSite.
  2. AuthSite проверяет и обнаруживает, что у пользователя нет файла cookie аутентификации, поэтому запрашиваются фактические учетные данные.
  3. AuthSite устанавливает токен на себя и передает секрет на страницу AuthConfirm на SiteA. SiteA проверяет токен и устанавливает файл cookie аутентификации и позволяет пользователю посещать защищенные страницы.

Тот же пользователь, впервые на SiteB

  1. Пользователь Джон успешно вошел в SiteA с помощью AuthSite, теперь пытается посетить SiteB.
  2. SiteB обнаруживает, что пользователь не вошел в систему, поэтому он направляется на AuthSite.
  3. AuthSite обнаруживает, что у пользователя уже есть файл cookie для веб-сайта AuthSite.
  4. AuthSite перенаправляет пользователя обратно на SiteB с секретом аутентификации.
  5. SiteB проверяет секрет и позволяет Джону продолжать посещать защищенные страницы.
person Akash Kava    schedule 14.09.2009
comment
Спасибо! Но я не нашел, как ваш сценарий работает в этом сценарии - неаутентифицированный пользователь переходит на SiteB и перенаправляется на SiteA для аутентификации, и как SiteA, SiteB и SiteC, принадлежащие к разным доменам, используют одну и ту же информацию аутентификации (например, если пользователь прошел аутентификацию на одном из сайтов, пользователю не нужно повторно аутентифицироваться на других сайтах). Буду признателен, если вы могли бы предоставить дополнительную информацию об этом. Еще раз спасибо! - person George2; 14.09.2009
comment
Если неаутентифицированный пользователь переходит на SiteA, SiteB или SiteC, он перенаправляется на AuthSite (AuthSite - это отдельный сайт, такой как Microsoft Passport, OpenID, используемый StackOverflow, Facebook Connect). Я постараюсь проиллюстрировать это на примере. - person Akash Kava; 14.09.2009
comment
Вы говорите о федерации, которая, когда все сайты находятся в одном домене, является излишним. - person blowdart; 14.09.2009