【问题标题】:Dual forms authentication in asp.net 2.0 - 4.0asp.net 2.0 - 4.0 中的双重形式身份验证
【发布时间】:2012-06-04 04:02:31
【问题描述】:

背景

我在同一个域下有两个网站。一个网站只封装了登录/账户管理功能,另一个网站是真正的网站。

  • LoginWeb - 只有登录页面/css/images/javascript 文件夹允许匿名访问
  • AdminWebsite - 通过表单身份验证完全锁定。即甚至 javascript/images/css 文件夹都没有 <authorization><allow users=*>


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

  1. 如果用户点击 AdminWebsite 上的任何页面,他会被 FormsAuthentication 发送回 LoginWeb
  2. 用户在登录页面中提供凭据,LoginWeb 网站发出表单身份验证票。用户仍未登录 AdminWebSite。 (这样用户可以去更改密码页面等进行帐户管理功能)
  3. 用户在 LoginWeb 中再执行两个步骤,现在可以为 AdminWebsite 颁发 FormsAuth 票证并重定向到该票证。

99% 已经在工作了
这是 LoginWeb 中的代码,它尝试为 AdminWeb 发出 FormsAuth 票证,但它不起作用。即 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);
}

这些是我的表单身份验证的 web.config 部分:
登录网站

  <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>

【问题讨论】:

  • 这是为 Turnkey 和其他人准备的……非常有趣的事情。与常识相反,如果我删除 SetAuthenticationTicket() 函数中的 Domain = "xxx.com" 行,它就会神奇地开始工作。但是,我正在 localhost 上对此进行测试,因此可能与此有关,但这根本没有意义。
  • 这可能是关键,因为 localhost 客户端会从浏览器请求 localhost 域的票证。也许将其与为 LOGINWEB 创建的票证进行比较。

标签: c# asp.net-mvc forms-authentication formsauthenticationticket


【解决方案1】:

此站点 Forms Authentication Across Applications 暗示表单属性上的名称应该相同。

【讨论】:

  • 我认为你误解了我想要达到的目标。两个站点都已经使用 Forms Auth 运行良好(即在表单元素中使用相同的名称,就像你说的那样。但我试图不这样做。即我想要一个单独的表单身份验证 cookie/ticket 用于 LoginWeb 和一个单独的用于AdminWeb。但是 LoginWeb 也应该能够为 AdminWeb 发出票证。(参见上面称为 SetAuthenticationTicket() 的函数)。这是为具有相同 Forms Name 的 AdminWeb 发出票证的那个。
  • 很抱歉让您感到困惑。如果没有一些特殊的单点登录代码,我不确定是否可以完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 2018-06-23
  • 2013-10-04
  • 1970-01-01
  • 2018-01-26
相关资源
最近更新 更多