我正在开发一个应用程序的原型,我们计划使用WIF 4.5在MVC5中构建,它将针对ADFS服务器进行身份验证。到目前为止,我的ADFS实现正在运行,但是需要允许Intranet上的用户被动地向某个控制器(例如Admin控制器)进行身份验证,而外部用户将使用ADFS在Home控制器上进行身份验证。乍一看,我认为这将是一个简单的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。我使用On-Premises Organizational Authentication Option (ADFS) With ASP.NET in Visual Studio 2013启动了模板,并输入了管理员提供的metatdata。因此,我的项目或多或少是该模板的一个vanilla实现,只需一点定制就可以使用我从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>
到我的applicationhost.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工作流程,但它会在Admin控制器上正确使用Windows身份验证。
答案 0 :(得分:1)
您无法覆盖给定位置的身份验证方法。您的应用程序只能有一种身份验证方法。
对于Windows身份验证,它只有在托管应用程序的服务器与您的Intranet用户位于同一域时才有效,除非您在这些域之间有信任。
如果您的Intranet中也有ADFS可用,则可以在2个ADFS实例之间建立联合。然后,您可以为外部/内部用户进行身份验证。
对于您的授权规则,您需要使用声明来授予管理部分的访问权限。当用户通过内部ADFS进行身份验证时,您需要添加声明转换模块以添加管理员角色声明,您可以使用它来设置控制器的权限。
正如您所猜测的,这不是一个简单的实施解决方案,如果您没有ADFS,则需要在内部设置更多的基础设施。
另一种方法是在您的应用中配置您的内部用户。如果您只需要授予少数用户访问权限,这可能是一种更简单的方法。