8

我正在为我的公司开发一个基于网络的内部工具。该工具的一部分是另一个应用程序(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>

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

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

4

8 回答 8

8

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

感谢大家的帮助。这是一个障碍。

于 2008-08-21T04:01:22.467 回答
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" />

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

于 2008-08-21T03:28:52.247 回答
1

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

于 2008-08-21T03:53:15.293 回答
0

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

<deny users="?"/>
于 2008-08-21T02:36:47.647 回答
0

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

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

<deny users="?"/>
于 2008-08-21T02:56:51.293 回答
0

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

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

但那是使用微软的方式

于 2008-08-21T03:31:17.983 回答
0

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

于 2008-11-28T16:07:53.393 回答
0

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

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

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

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

这会关闭 IsolateApps 默认值。

然后一切正常!

于 2017-01-16T13:48:40.240 回答