我正在使用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
启用此功能?我是否需要更改sitea
和siteb
的web.config?
另一个困惑是,如果用户通过sitea
进行身份验证,则确保sitea
可以识别用户的身份,但siteb
如何识别用户的身份而无需验证用户了吗?
答案 0 :(得分:8)
假设两个站点共享相同的成员资格数据库,那么您可以在web.config的forms authentication部分设置cookie域;
<authentication mode="Forms">
<forms .... domain="mycorp.com"/>
</authentication>
请注意,您还必须在web.config中设置匹配的machine keys,因为这些用于签署身份验证Cookie。
答案 1 :(得分:3)
答案 2 :(得分:2)
此链接提供了一些详细信息http://docs.communityserver.com/2007/270-common-things-to-check-when-using-forms-authentication/
基本上,您需要在web.config文件的<forms/>
标记内的<authentication>
标记中添加domain属性。
e.g。
<authentication mode="Forms">
<forms name=".CookieName" ... domain=".mydomain.com" />
</authentication>
答案 3 :(得分:1)
答案 4 :(得分:0)
我会建议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);
}
}
现在让我们看一个不同的场景。
相同用户,首次登录
相同用户,第一次访问SiteB