ASP.NET中的表单身份验证问题

时间:2009-09-14 05:36:01

标签: asp.net iis-7 forms-authentication

我正在使用Visual Studio Team System 2008(VSTS),C#,.NET 3.5,IIS 7.0和ASP.NET。我有两个IIS网站,即网站A和网站B.他们的相关域名是http://sitea.example.comhttp://siteb.example.com

我在使用表单身份验证时听说过,我们可以启用域级Cookie,即两个站点位于同一个域中(例如,sitea.example.comsiteb.example.com都位于域example.com中),最终用户只需要进行一次身份验证。更详细地说,如果用户通过其中一个站点进行了身份验证(通过身份验证),则无需再在其他站点中对用户进行身份验证。

如何为siteasiteb启用此功能?我是否需要更改siteasiteb的web.config?

另一个困惑是,如果用户通过sitea进行身份验证,则确保sitea可以识别用户的身份,但siteb如何识别用户的身份而无需验证用户了吗?

5 个答案:

答案 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)

web.config

的表单标记中将域属性设置为.mycorp.com

答案 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);
   }
}

现在让我们看一个不同的场景。

相同用户,首次登录

  1. 第一个访问SiteA的用户John(尚未登录)被重定向到AuthSite。
  2. AuthSite会检查并发现该用户没有身份验证Cookie,因此会询问实际凭据。
  3. AuthSite在其自身上设置令牌并将秘密传递给SiteA上的AuthConfirm页面。 SiteA验证令牌并设置身份验证cookie,并允许用户访问安全页面。
  4. 相同用户,第一次访问SiteB

    1. 用户John使用AuthSite成功登录SiteA,现在尝试访问SiteB。
    2. SiteB发现用户未登录,因此将其定向到AuthSite。
    3. AuthSite发现用户已经拥有AuthSite网站的Cookie。
    4. AuthSite使用身份验证密钥将用户重定向回SiteB。
    5. SiteB验证秘密并让John继续访问安全 页。