我正在为我们计划使用WIF 4.5在MVC5中构建的应用程序开发原型,该应用程序将针对ADFS服务器进行身份验证。到目前为止,我可以使用ADFS实施,但是存在一个要求,即允许内部网上的用户被动地对某个控制器(例如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。我在Visual Studio 2013中使用带有ASP.NET的本地组织身份验证选项(ADFS)来开始模板,并输入了管理员提供的元数据。因此,我的项目或多或少是该模板的原始实现,并进行了一些自定义,以使用从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工作流程,但是它将在管理控制器上正确使用Windows身份验证。
您不能覆盖给定位置的身份验证方法。您的应用程序只能有一种身份验证方法。
对于Windows身份验证,除非托管该应用程序的服务器与您的Intranet用户位于同一域中,否则它将起作用。
如果Intranet中也有ADFS,则可以在2个ADFS实例之间建立联盟。然后,您可以对外部/内部用户进行身份验证。
对于您的授权规则,您将需要使用声明来授予对admin部分的访问权限。您需要添加一个声明转换模块,以在内部ADFS对用户进行身份验证时添加一个管理员角色声明,您可以使用该角色来设置控制器的权限。
如您所料,这不是一个简单的解决方案,如果您那里没有ADFS,则需要在内部进行更多基础结构设置。
另一种方法是在您的应用程序中配置您的内部用户。如果您只需要向少数用户授予访问权限,则这可能是一种更简单的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句