Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET中的表单身份验证问题_Asp.net_Iis 7_Forms Authentication - Fatal编程技术网

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

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),最终用户只需要验证

我正在使用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
),最终用户只需要验证一次。更详细地说,如果用户通过其中一个站点的身份验证(通过身份验证),则无需在其他站点中再次对用户进行身份验证

如何为我的
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