Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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
C# asp.net 2.0-4.0中的双表单身份验证_C#_Asp.net Mvc_Forms Authentication_Formsauthenticationticket - Fatal编程技术网

C# asp.net 2.0-4.0中的双表单身份验证

C# asp.net 2.0-4.0中的双表单身份验证,c#,asp.net-mvc,forms-authentication,formsauthenticationticket,C#,Asp.net Mvc,Forms Authentication,Formsauthenticationticket,背景 我在同一个域名下有两个网站。一个网站仅封装登录/帐户管理功能,另一个网站是真实的网站 登录Web-只有登录页面/css/images/javascript文件夹允许匿名访问 管理员网站-通过表单验证完全锁定。i、 e甚至javascript/images/css文件夹都没有 我正在努力实现的目标 这是我正在努力实现的工作流程,已经完成了99%: 如果用户点击管理员网站上的任何页面,他将通过FormsAuthentication返回到登录网站 用户在登录页面中提供凭据,并且LoginWe

背景

我在同一个域名下有两个网站。一个网站仅封装登录/帐户管理功能,另一个网站是真实的网站

  • 登录Web-只有登录页面/css/images/javascript文件夹允许匿名访问
  • 管理员网站-通过表单验证完全锁定。i、 e甚至javascript/images/css文件夹都没有

我正在努力实现的目标 这是我正在努力实现的工作流程,已经完成了99%:

  • 如果用户点击管理员网站上的任何页面,他将通过FormsAuthentication返回到登录网站
  • 用户在登录页面中提供凭据,并且LoginWeb网站发布表单验证票证。用户尚未登录到管理员网站。(这样用户就可以进入“更改密码”页面等并执行帐户管理功能)
  • 用户在LoginWeb中执行另外两个步骤,现在可以为AdminWebsite颁发FormsAuth票证并重定向到该票证 99%已经开始工作了
    这是LoginWeb中的代码,它试图为AdminWeb颁发FormsAuth票证,但不起作用。i、 e AdminWeb仍在将我重定向回登录。我确信我遗漏了一些非常琐碎的东西,但我不知道它到底是什么

    public void SetAuthenticationTicket(string username)
    {
        MachineKeySection sec=(MachineKeySection)WebConfigurationManager.OpenWebConfiguration("").SectionGroups["system.web"].Sections["machineKey"]; 
        FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
            username,
            DateTime.Now,
            DateTime.Now.AddMinutes(30),
            false, //true or false
            sec.DecryptionKey, //Custom data like your webkey can go here
            FormsAuthentication.FormsCookiePath);
    
        var encryptedTicket = FormsAuthentication.Encrypt(ticket);
        var cookie = new HttpCookie("ADMINWEB", encryptedTicket)
        {
            Path = FormsAuthentication.FormsCookiePath,
            Domain = "xxx.com"
        };
        Response.AppendCookie(cookie);
    }
    

    以下是Forms Auth的my web.config部分:
    LoginWeb

      <machineKey validationKey="XXXXXX" decryptionKey="XXX" validation="SHA1"/>
      <authentication mode="Forms">
        <forms name="LoginWeb"
                domain="xxx.com"
                loginUrl="~/account/Logon"
                timeout="1440"
                cookieless="UseCookies"
                slidingExpiration="false"
                protection="All"
                path="/"/>
      </authentication>
    
    
    

    管理员网站

       <machineKey validationKey="XXXXXX" decryptionKey="XXX" validation="SHA1"/>
      <authentication mode="Forms">
        <forms name="ADMINWEB"
                domain="xxx.com"
                loginUrl="http://loginweb/account/Logon"
                timeout="1440"
                cookieless="UseCookies"
                slidingExpiration="false"
                protection="All"
                path="/"/>
    </authentication>
    <authorization>
        <deny users="?"/>
    </authorization>
    
    
    
    此站点意味着表单属性上的名称应该相同。

    我想你误解了我想要实现的目标。这两个网站使用Forms Auth(如您所说,在Forms元素中使用相同的名称)已经可以正常工作。但我尝试不这样做。例如,我希望LoginWeb有一个单独的Forms Auth cookie/ticket,AdminWeb有一个单独的Forms Auth cookie/ticket。但是LoginWeb也应该能够为AdminWeb发出ticket。(请参阅上面名为SetAuthenticationTicket()的函数)。这是为具有相同表单名称的AdminWeb颁发票证的票证。对此感到抱歉。我不确定如果没有一些特殊的单点登录代码,这是否可以完成。这是针对Turnkey和其他人的……非常有趣的事情。与常识相反,如果我删除SetAuthenticationTicket()中的Domain=“xxx.com”行功能,它神奇地开始工作。我正在localhost上测试此功能,因此它可能与此有关,但毫无意义。这可能是关键,因为localhost客户端将从浏览器请求localhost域的票证。可能会将其与为LOGINWEB创建的票证进行比较。