我会建议 Stack Overflow、Microsoft、Facebook、Google Accounts 的做法,而且效率更高,因为每个网站都可以在不同的机器上。
假设,您有 AuthSite。这是您必须登录的一个站点,并且有会员信息。
您在不同的服务器上有 SiteA、SiteB 和 SiteC。
在 SiteA 的登录页面上,您必须在 AuthSite 上设置一个带有密码的表单帖子。
如果您之前在 AuthSite 上成功登录,它只会以浏览器中隐藏的表单帖子的形式重定向回 SiteA,并带有成功的秘密,您必须在 SiteA 中进行验证。
此模型具有高度可扩展性和可扩展性。因为从长远来看,维护很容易。
SiteA、SiteB、SiteC的LoginPage代码如下。
SiteA、SiteB 和 SiteC 上的 Login.aspx:
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");
}
AuthSite 上的 Login.aspx:
// 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);
}
SiteA、SiteB 和 SiteC 上的 AuthConfirm.aspx:
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(尚未登录)的用户 John 被重定向到 AuthSite。
- AuthSite 检查并发现用户没有身份验证 cookie,因此会询问实际凭据。
- AuthSite 在自身上设置令牌并将秘密传递给 SiteA 上的 AuthConfirm 页面。 SiteA 验证令牌并设置身份验证 cookie 并允许用户访问安全页面。
同一用户,第一次访问 SiteB
- 用户 John 已使用 AuthSite 成功登录到 SiteA,现在尝试访问 SiteB。
- SiteB 发现用户未登录,因此将其定向到 AuthSite。
- AuthSite 发现用户已有 AuthSite 网站的 cookie。
- AuthSite 使用身份验证密钥将用户重定向回 SiteB。
- SiteB 验证秘密并让 John 继续安全访问
页面。