ASP.NET中的表单身份验证问题
我正在使用VisualStudioTeamSystem2008(VSTS)、C#、.NET3.5、IIS7.0和ASP.NET。我有两个IIS网站,站点A和站点B。它们的相关域名是,ASP.NET中的表单身份验证问题,asp.net,iis-7,forms-authentication,Asp.net,Iis 7,Forms Authentication,我正在使用VisualStudioTeamSystem2008(VSTS)、C#、.NET3.5、IIS7.0和ASP.NET。我有两个IIS网站,站点A和站点B。它们的相关域名是,http://sitea.example.com和http://siteb.example.com 我听说在使用表单身份验证时,我们可以启用域级Cookie,也就是说,如果两个站点在同一个域中(例如sitea.example.com和siteb.example.com都在域example.com),最终用户只需要验证
http://sitea.example.com
和http://siteb.example.com
我听说在使用表单身份验证时,我们可以启用域级Cookie,也就是说,如果两个站点在同一个域中(例如sitea.example.com
和siteb.example.com
都在域example.com
),最终用户只需要验证一次。更详细地说,如果用户通过其中一个站点的身份验证(通过身份验证),则无需在其他站点中再次对用户进行身份验证
如何为我的sitea
和siteb
启用此功能?我是否需要更改sitea
和siteb
的web.config
另一个困惑是,如果用户是通过
sitea
认证的,那么用户的身份肯定是通过sitea
识别的,但是siteb
如何在不再次认证用户的情况下识别用户的身份呢?此链接提供了一些详细信息
基本上,您需要在web.config文件的
标记内的
标记中添加域属性
e、 g
此链接提供了一些详细信息 基本上,您需要在web.config文件的
标记内的
标记中添加域属性
e、 g
在中的表单标记中将域属性设置为.mycorp.com,在中的表单标记中将域属性设置为.mycorp.com,假设两个站点共享相同的成员数据库,则可以在web.config部分中设置cookie域
<authentication mode="Forms">
<forms .... domain="mycorp.com"/>
</authentication>
,因为它们用于对身份验证cookie进行签名。假设两个站点共享相同的成员数据库,则您可以在web.config部分中设置cookie域
<authentication mode="Forms">
<forms .... domain="mycorp.com"/>
</authentication>
在web.config中,因为它们用于对身份验证cookie进行签名。有一个。有一个。我建议使用堆栈溢出、Microsoft、Facebook和Google帐户的方式,这更有效,因为每个网站都可以位于任何不同的机器上
假设您拥有AuthSite。这是一个你必须登录的网站,并且有会员信息
在不同的服务器上有SiteA、SiteB和SiteC
在SiteA的登录页面上,您必须在AuthSite上设置带有密码的表单帖子
如果您之前已成功登录AuthSite,它将以浏览器中隐藏的表单帖子的形式重定向回SiteA,您必须在SiteA中验证该密码
该模型具有高度的可扩展性和可扩展性。因为从长远来看,维护是很容易的
SiteA、SiteB和SiteC登录页面上的代码如下
站点A、站点B和站点C上的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");
}
// 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);
}
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);
}
}
AuthSite上的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");
}
// 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);
}
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);
}
}
站点A、站点B和站点C上的AuthConfirm.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");
}
// 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);
}
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,并允许用户访问安全页面
同一用户,第一次登录站点b
用户John已使用AuthSite成功登录到SiteA,现在尝试访问SiteB
SiteB发现用户未登录,因此将其定向到AuthSite
AuthSite发现用户已经拥有AuthSite网站的cookie
AuthSite将用户重定向回具有身份验证密钥的SiteB
SiteB验证了这个秘密,并允许John继续访问secure
页数
我建议采用Stack Overflow、Microsoft、Facebook、Google帐户的方式,这样更有效,因为每个网站都可以在不同的机器上运行
假设您拥有AuthSite。这是一个你必须登录的网站,并且有会员信息
在不同的服务器上有SiteA、SiteB和SiteC
在SiteA的登录页面上,您必须在AuthSite上设置带有密码的表单帖子
如果您之前已成功登录AuthSite,它将以浏览器中隐藏的表单帖子的形式重定向回SiteA,您必须在SiteA中验证该密码
该模型具有高度的可扩展性和可扩展性。因为从长远来看,维护是很容易的
SiteA、SiteB和SiteC登录页面上的代码如下
站点A、站点B和站点C上的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");
}
// 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);
}
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);
}
}
AuthSite上的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");
}
// 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);
}
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);
}
}
站点A、站点B和站点C上的AuthConfirm.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");
}
// 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);
}
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,并允许用户访问安全页面
同一用户,第一次登录站点b
用户John已使用AuthSite成功登录到SiteA,现在尝试访问SiteB
SiteB发现用户未登录,因此将其定向到AuthSite
AuthSite发现用户已经拥有AuthSite网站的cookie
AuthSite将用户重定向回具有身份验证密钥的SiteB
SiteB验证se