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