使用 VS 2013 和 ADFS 2.0 在 ASP.NET WebApi 中实施基于声明的身份验证

Implementing Claims based authentication in ASP.NET WebApi using VS 2013 and ADFS 2.0

我最近在 Visual Studio 2013 年构建了一个基于 asp.net mvc 5 的应用程序,它通过与我们的 ADFS 服务器交互使用基于声明的身份验证。我们使用ADFS 2.0,服务器操作系统是Windows 2008 R2。我遵循了本教程:http://www.cloudidentity.com/blog/2014/02/12/use-the-on-premises-organizational-authentication-option-adfs-with-asp-net-in-visual-studio-2013/ 并让应用程序按照我的期望工作。 现在,我的任务是构建一个基于声明的 asp.net web api 服务,该服务将由我公司的一些 Intranet 应用程序使用。我想我会按照类似的步骤来完成这项工作。但是,当我 select Web API 选项和 select 身份验证->组织帐户->本地时,它提到“ADFS in Windows需要 Server 2012 R2 或更高版本”,本质上意味着需要 ADFS 3.0。在构建 MVC 应用程序时,这不是必需的。我尝试指定 ADFS 2.0 联合元数据 url,但当 运行 应用程序时它给了我一个错误。我可以使用 ADFS 2.0 并使用 Visual Studio 2013 构建 Web api 服务吗?

这是我过去的做法。如果有人有更好的想法,我愿意接受建设性的批评。

首先,将以下 NuGet 包添加到您的 WebAPI 项目中:

ValidatingIssuerNameRegistry

接下来,注释掉/App_Start/Startup中的ConfigureAuth方法体。Auth.cs

public void ConfigureAuth(IAppBuilder app)
{
    ////app.UseActiveDirectoryFederationServicesBearerAuthentication(
    ////    new ActiveDirectoryFederationServicesBearerAuthenticationOptions
    ////    {
    ////        Audience = ConfigurationManager.AppSettings["ida:Audience"],
    ////        MetadataEndpoint = ConfigurationManager.AppSettings["ida:AdfsMetadataEndpoint"]
    ////    });
}

接下来,将以下配置部分添加到 web.config 的顶部:

<configuration>
  <configSections>
    <section name="system.identityModel"
             type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
    <section name="system.identityModel.services" type="System.IdentityModel.Services.Configuration.SystemIdentityModelServicesSection, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
  </configSections>
  <!-- The rest of your config goes here -->
</configuration>

然后,添加以下应用程序配置值(您可能还想删除键以 "ida:" 开头的任何现有条目)

<appSettings>
  <add key="ida:FederationMetadataLocation" value="https://adfs.yourdomain.com/FederationMetadata/2007-06/FederationMetadata.xml" />
  <add key="ida:Issuer" value="https://adfs.yourdomain.com/adfs/ls/" />
  <add key="ida:ProviderSelection" value="productionSTS" />
</appSettings>

然后,添加以下 system.web 值:

<system.web>
  <authorization>
    <deny users="?" />
  </authorization>
  <authentication mode="None" />
</system.web>

最后,将以下内容添加到配置文件的末尾:

<system.identityModel>
  <identityConfiguration>
    <audienceUris>
      <add value="https://localhost:44444/" />
    </audienceUris>
    <issuerNameRegistry type="System.IdentityModel.Tokens.ValidatingIssuerNameRegistry, System.IdentityModel.Tokens.ValidatingIssuerNameRegistry">
    <authority name="http://adfs.yourdomain.com/adfs/services/trust">
        <keys>
          <add thumbprint="1234567890123456789012345678901234567890" />
        </keys>
        <validIssuers>
          <add name="http://adfs.yourdomain.com/adfs/services/trust" />
        </validIssuers>
      </authority>
    </issuerNameRegistry>
    <!-- if chain trust doesn't work, look at the other options for this value -->
    <certificateValidation certificateValidationMode="ChainTrust" />
  </identityConfiguration>
</system.identityModel>
<system.identityModel.services>
  <federationConfiguration>
    <cookieHandler requireSsl="true" />
    <wsFederation passiveRedirectEnabled="true" issuer="https://adfs.yourdomain.com/adfs/ls/" realm="https://localhost:44444/" requireHttps="true" />
  </federationConfiguration>
</system.identityModel.services>

上面有一些占位符值,例如 http://localhost:44444/adfs.yourdomain.com,您需要提供适合您的组织的值。

希望这对您有所帮助。

更新:

我忘记了模块:

<system.webServer>
  <modules>
    <remove name="FormsAuthentication" />
    <remove name="WebDavModule" />
    <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>

您可能需要将对 System.IdentityModel 和 System.IdentityModel 的引用添加到您的项目中。