我正在为我们计划使用 WIF 4.5 在 MVC5 中构建的应用程序开发原型,该应用程序将针对 ADFS 服务器进行身份验证。 到目前为止,我已经有了 ADFS 实现,但是需要允许 Intranet 上的用户被动地向某个控制器(例如管理控制器)进行身份验证,而外部用户将使用 ADFS 在主控制器上进行身份验证。 乍一看,我认为这将是一个简单的 web.config 设置,但现在看来情况并非如此。
ADFS 与应用程序不在同一域中,但是我希望 Windows 身份验证发生在应用程序所在的域上。
我的问题是,A)这是可能的,还是我试图做一些框架不打算处理的事情? B) 我怎样才能做到这一点?
我尝试了几种不同的组合
<location path="Admin">
<system.web>
<!--Having this here throws an error-->
<authentication mode="Windows"></authentication>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>`
<system.web>
<authentication mode="None|Federated|Windows" />
<authorization>
<deny users="?" />
</authorization>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" requestValidationMode="4.5" />
</system.web>
似乎,如果强制执行任何身份验证,则始终是 ADFS。 我在 Visual Studio 2013 中使用本地组织身份验证选项 (ADFS) 和 ASP.NET 启动了模板,并输入了管理员提供的元数据。 因此,我的项目或多或少是该模板的香草实现,并进行了一些自定义以使用我从 ADFS 工作流中获得的用户对象。
在位置节点中设置身份验证模式时,上面引用的错误是
使用注册为 allowDefinition='MachineToApplication' 超出应用程序级别的部分是错误的。此错误可能是由于虚拟目录未配置为 IIS 中的应用程序引起的。
我收集的内容与未将虚拟目录设置为IIS中的应用程序有关,但这不是所需的结果。 此外,当我实际尝试符合此错误时,我仍然无法使身份验证正常工作。
更多细节,经过更多的修补,我发现IISExpress设置(以及最终的IIS)实际上需要设置,这是可以的。 所以添加
<location path="WebApplication4/Admin">
<system.webServer>
<security>
<authentication>
<windowsAuthentication enabled="true" />
<anonymousAuthentication enabled="false" />
</authentication>
</security>
</system.webServer>
</location>
到我的应用程序host.config确实开始提示浏览器输入用户名和密码,但我也发现
<system.webServer>
<modules>
<add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
<add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
</modules>
</system.webServer>
似乎最终完全劫持了我的身份验证,并强制所有内容都通过 ADFS 服务器。 我可以手动调用 ADFS 身份验证的方法,因此我想做的是以某种方式告诉控制器不要使用它,而是使用 Windows 身份验证。 似乎如果我简单地注释掉这些模块,它会破坏我的 ADFS 工作流程,但随后它将在管理控制器上正确使用 Windows 身份验证。
不能覆盖给定位置的身份验证方法。应用程序只能使用一种身份验证方法。
至于Windows身份验证,仅当托管应用程序的服务器与您的Intranet用户位于同一域中时,它才会起作用,除非您在域之间具有信任关系。
如果您的内部网中也有可用的 ADFS,则可以在 2 个 ADFS 实例之间建立联合身份验证。然后,您可以为外部/内部用户完成身份验证。
对于授权规则,您需要使用声明来授予对管理部分的访问权限。当用户通过内部 ADFS 进行身份验证时,你将需要添加一个声明转换模块来添加管理员角色声明,该 ADFS 可用于在控制器上设置权限。
正如你可以猜到的,这不是一个简单的解决方案,如果你没有 ADFS,这将需要在内部进行更多的基础结构设置。
另一种方法是在应用中预配内部用户。如果只需要向少数用户授予访问权限,则这可能是一种更简单的方法。