Я бы предложил способ переполнения стека, 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);
}
}
Теперь давайте посмотрим на другой сценарий.
Тот же пользователь, первый вход в систему
- Первый пользователь, Джон, посетив SiteA (пока нет)вошел в систему) перенаправляется на AuthSite.
- AuthSite проверяет и обнаруживает, что у пользователя нет cookie для аутентификации, поэтому запрашиваются фактические учетные данные.
- AuthSite устанавливает токен на себя и передает секрет AuthConfirmстраница на сайте.SiteA проверяет токен и устанавливает файл cookie аутентификации и позволяет пользователю посещать защищенные страницы.
Тот же пользователь, впервые на сайте B
- Пользователь Джонуспешно вошел в SiteA с помощью AuthSite, теперь пытается посетить SiteB.
- SiteB обнаруживает, что пользователь не вошел в систему, поэтому он направлен в AuthSite.
- AuthSite обнаруживает, что у пользователя уже есть файл cookieдля веб-сайта AuthSite.
- AuthSite перенаправляет пользователя обратно на SiteB с секретом аутентификации.
- SiteB проверяет секрет и позволяет Джону продолжать посещать защищенные страницы.