.NET MVC5 w / ADFS和Windows身份验证

时间:2014-11-14 22:21:52

标签: authentication asp.net-mvc-5 wif adfs

我正在开发一个应用程序的原型,我们计划使用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身份验证。

1 个答案:

答案 0 :(得分:1)

您无法覆盖给定位置的身份验证方法。您的应用程序只能有一种身份验证方法。

对于Windows身份验证,它只有在托管应用程序的服务器与您的Intranet用户位于同一域时才有效,除非您在这些域之间有信任。

如果您的Intranet中也有ADFS可用,则可以在2个ADFS实例之间建立联合。然后,您可以为外部/内部用户进行身份验证。

对于您的授权规则,您需要使用声明来授予管理部分的访问权限。当用户通过内部ADFS进行身份验证时,您需要添加声明转换模块以添加管理员角色声明,您可以使用它来设置控制器的权限。

正如您所猜测的,这不是一个简单的实施解决方案,如果您没有ADFS,则需要在内部设置更多的基础设施。

另一种方法是在您的应用中配置您的内部用户。如果您只需要授予少数用户访问权限,这可能是一种更简单的方法。

相关问题