Проверка подлинности форм в ASP.NET - PullRequest
1 голос
/ 14 сентября 2009

Я использую 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 может распознать личность пользователя без повторной аутентификации пользователя?

Ответы [ 5 ]

8 голосов
/ 14 сентября 2009

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

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

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

3 голосов
/ 14 сентября 2009

На MSDN есть пример .

2 голосов
/ 14 сентября 2009

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

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

, например

<authentication mode="Forms">
<forms name=".CookieName" ... domain=".mydomain.com" />
</authentication>
1 голос
/ 14 сентября 2009

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

0 голосов
/ 14 сентября 2009

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

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

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

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

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

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

Код на LoginPage 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 проверяет токен и устанавливает файл cookie аутентификации и позволяет пользователю посещать защищенные страницы.

Тот же пользователь, впервые на сайте B

  1. Пользователь Джонуспешно вошел в SiteA с помощью AuthSite, теперь пытается посетить SiteB.
  2. SiteB обнаруживает, что пользователь не вошел в систему, поэтому он направлен в AuthSite.
  3. AuthSite обнаруживает, что у пользователя уже есть файл cookieдля веб-сайта AuthSite.
  4. AuthSite перенаправляет пользователя обратно на SiteB с секретом аутентификации.
  5. SiteB проверяет секрет и позволяет Джону продолжать посещать защищенные страницы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...