我正在为我的公司开发一个基于内部网络的工具。该工具的一部分是另一个应用程序(巡航控制仪表板),该应用程序在我的根应用程序下的自己的虚拟目录中运行。

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

我将以下内容放入根应用程序 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>

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

我有一种感觉 <allow> 和 <deny> 标签设置错误。有人可以澄清一下吗?

有帮助吗?

解决方案

我认为您可能还需要将 path="/" 放在 <forms 标记中。抱歉,我已经有一段时间没有这样做了

其他提示

您可能还需要将 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>

感谢大家的帮助。这真是一个难题。

FormsAuthentication 加密它提供给用户的令牌,并且默认情况下它加密每个应用程序不同的密钥。要使 Forms Auth 跨应用程序工作,您需要执行以下操作:

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

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

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

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

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

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

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

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

<deny users="?"/>

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

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

但这是使用 微软之道

您允许所有未经身份验证的行为。您可能正在寻找这样的东西

<deny users="?"/>

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

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

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

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

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

这会关闭 IsolateApps 默认值。

然后一切就正常了!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top