【问题标题】:Forms Authentication across Applications跨应用程序的表单身份验证
【发布时间】:2010-09-06 08:41:51
【问题描述】:

我正在为我的公司开发一个基于网络的内部工具。该工具的一部分是另一个应用程序(Cruise Control Dashboard),它在我的根应用程序下的自己的虚拟目录中运行。

我想通过设置表单身份验证来限制对这个内部应用程序的访问,并在根应用程序中有一个登录表单。

我将以下内容放入根应用程序 web.config:

<location path="ccnet">
  <system.web>
    <authentication mode="Forms">
        <forms loginUrl="/default.aspx" timeout="5000"/>
    </authentication>
    <authorization>
      <allow users="?"/>
      <deny users="?"/>
    </authorization>        
  </system.web>    
</location>

但是,表单身份验证似乎不起作用,当我直接访问该应用程序时,它不会重定向回登录页面。

我感觉我的 标签设置错误。有人可以澄清一下吗?

【问题讨论】:

    标签: asp.net authentication cruisecontrol.net


    【解决方案1】:

    您可能还需要将 path="/" 放在

    就是这样!

    所以,总结,为了做到这一点;

    在根 web.config 添加:

    <machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="SHA1" />
    

    必须这样做,因为默认情况下它是“AutoGenerate,IsolateApps”。

    其次,您必须在两者中将表单 Auth cookie 命名为相同,我在根目录中使用位置标记完成了这一切:

    <authentication mode="Forms">
       <forms name="ccAuth" loginUrl="/default.aspx"  path="/" timeout="5000"/>
    </authentication>
    <authorization>
       <deny users="?"/>
    </authorization>
    

    最后:

    <location path="ccnet">
      <system.web>
        <authentication mode="Forms">
          <forms name="ccAuth" loginUrl="/default.aspx"  path="/" timeout="5000"/>
        </authentication>
        <authorization>
          <deny users="?"/>
        </authorization>      
      </system.web>    
    </location>
    

    感谢大家的帮助。这是一个笨蛋。

    【讨论】:

    • 天哪!在 machineKey 元素中隔离应用程序!谢谢谢谢,我的头发现在可以长回来了:)
    【解决方案2】:

    FormsAuthentication 会加密它提供给用户的令牌,并且默认情况下它会为每个应用程序加密不同的密钥。要让 Forms Auth 跨应用程序工作,您需要做以下几件事:

    首先,在所有应用程序上设置相同的 Forms Auth“名称”。这是通过以下方式完成的:

    <authentication mode="Forms">  
        <forms name="{name}" path="/" ...>
    </authentication>
    

    在两个应用程序 web.configs 中将“名称”设置为相同。

    其次,您需要告诉两个应用程序在加密时使用相同的密钥。这有点令人困惑。当我设置它时,我所要做的就是将以下内容添加到两个 web.configs 中:

    <machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="SHA1" />
    

    根据文档,这是默认值,但除非我指定它,否则它对我不起作用。

    【讨论】:

      【解决方案3】:

      我认为您可能还需要将 path="/" 放在

      【讨论】:

        【解决方案4】:

        这不起作用,它仍然允许所有用户(无论是否经过身份验证)都可以访问。

        我认为您甚至可以省略允许标记,因为它是多余的。只是:

        <deny users="?"/>
        

        【讨论】:

          【解决方案5】:

          那段代码放在乔纳森那里?根据我的经验,我有一个登录控件,并且在 OnAuthenticate 事件中我会将 Authenticated 设置为 false ...

          If CustomAuthenticate(Login1.UserName, Login1.Password) Then
              FormsAuthentication.RedirectFromLoginPage(Login1.UserName, False)
          Else
              e.Authenticated = False
          End If
          

          但那是使用 Microsoft Way

          【讨论】:

            【解决方案6】:

            您允许所有未经身份验证的人。您可能正在寻找类似的东西

            <deny users="?"/>
            

            【讨论】:

              【解决方案7】:

              此巡航控制应用程序的文件扩展名是什么?如果它不是 ASP.NET 注册处理的文件类型(例如 jsp、java 等),那么 ASP.NET 将不会充当身份验证机制(在 IIS 5 和 6 上)。例如,对于静态 html 文件,除非您实现了通配符映射,否则 IIS 会执行所有身份验证和授权并提供文件而不涉及 ASP.NET isapi 扩展。 IIS7 可以使用新的集成管道模式来拦截所有请求。对于 IIS6,您需要查看 Scott Gu's article on the matter

              【讨论】:

                【解决方案8】:

                以上建议都不适合我。结果在根 web.config 集中:

                <forms loginUrl="/pages/login.aspx" enableCrossAppRedirects="true"...
                

                并确保根应用和子应用都在 system.web 中

                <machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="SHA1"/>
                

                这会关闭 IsolateApps 默认值。

                然后一切正常!

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2013-12-21
                  • 1970-01-01
                  • 2011-05-01
                  • 1970-01-01
                  • 2014-01-26
                  • 2013-03-09
                  • 2014-11-17
                  • 2018-12-29
                  相关资源
                  最近更新 更多