跨应用程序的表单身份验证

时间:2020-03-05 18:41:22  来源:igfitidea点击:

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

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

我将以下内容放入根应用程序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>标记设置为错误。有人可以澄清吗?

解决方案

回答

我们允许所有未经身份验证的用户。我们可能正在寻找这样的东西

<deny users="?"/>

回答

That does not work, it still allows all users, (Authenticated or not) to access.

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

<deny users="?"/>

回答

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

首先,在所有应用程序上都设置相同的表单身份验证"名称"。这是通过以下方式完成的:

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

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

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

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

根据文档,多数民众赞成在默认值,但它对我不起作用,除非我指定它。

回答

乔纳森(Jonathan)那个代码在哪里?以我的经验,我有一个登录控件,在OnAuthenticate事件中,我会将Authenticated设置为false。

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

但这是使用微软的方式

回答

我们可能还需要在我认为的<forms标记中放入path =" /"。抱歉,自从我这样做以来已经有一段时间了

回答

You might also need to put path="/" in the

就是这样!

因此,总结,为了做到这一点;

在根web.config中添加:

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

之所以必须这样做,是因为默认情况下它是" AutoGenerate,IsolateApps"。

其次,我们必须将两者的表单Auth cookie都命名为相同的名称,我都是使用location标记在根目录中完成的:

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

感谢大家的帮助。这是一个绊脚石。

回答

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