1

我们有一个使用表单身份验证和自定义数据库来对用户进行身份验证的 ASP.NET (4.5) Web 应用程序。我们的客户使用 ADFS Active Directory 联合服务并希望使用 ADFS 用户登录我们的 Web 应用程序。我需要弄清楚如何将这些 ADFS 用户映射到应用程序自己的数据库中的自定义用户。当用户尝试访问我的应用程序登录页面时,他们会被重定向到 ADFS 登录页面,并且一旦经过身份验证,就会返回我的登录页面以及一个对象,该对象可以访问有关经过身份验证的用户的一些信息,然后我需要将这些信息映射到用户在我们的网络应用程序中。我真的很感激可以在这种情况下使用的简单代码示例。特别需要有关用户/主要对象或其他内容的信息 s 传回来,我可以用它来唯一地标识一个用户,也可能是用户所属的一个组,而不是编写我的代码来从我们的数据库中获取用户。我真的不想让网络应用程序 ADFS 感知,但我追求一些简单的东西。这将适用于这种情况。

4

1 回答 1

0

您可以让 ADFS 返回一个有助于识别用户身份的附加声明,例如电子邮件 - 有关详细信息,请参阅此答案。配置完成后,在控制器中使用以下代码获取经过 ADFS 身份验证的用户的电子邮件:

public static string GetAuthenticatedUserEmail()
{
    return ClaimsPrincipal.Current?.Identity?.IsAuthenticated ?? false
           ? ClaimsPrincipal.Current.Claims
             .SingleOrDefault(claim => claim.Type == ClaimTypes.Email)
             ?.Value
           : null;
}

您还可以通过以下配置部分验证声明颁发者:

<system.identityModel>
  <identityConfiguration>
    ...
    <certificateValidation certificateValidationMode="PeerOrChainTrust" />
    <issuerNameRegistry type="System.IdentityModel.Tokens.ValidatingIssuerNameRegistry, System.IdentityModel.Tokens.ValidatingIssuerNameRegistry">
      <authority name="http://your-adfs-domain.com/adfs/services/trust">
        <keys>
          <add thumbprint="the thumbprint" />
        </keys>
        <validIssuers>
          <add name="http://your-adfs-domain.com/adfs/services/trust" />
        </validIssuers>
      </authority>
    </issuerNameRegistry>
  </identityConfiguration>
</system.identityModel>
<system.identityModel.services>
  <federationConfiguration>
    <wsFederation issuer="https://your-adfs-domain.com/adfs/ls" realm="https://your-service-domain.com"
                  requireHttps="true" reply="https://your-service-domain/StartPage" passiveRedirectEnabled="true" />
    <serviceCertificate>
      <!-- The sertificate should have a private key -->
      <certificateReference x509FindType="FindBySubjectName" findValue="some subject" storeLocation="LocalMachine" storeName="My" />
    </serviceCertificate>
  </federationConfiguration>
</system.identityModel.services>

最后,您可以通过检索到的电子邮件(或其他声明)将用户映射到您的表。

于 2016-10-17T08:28:29.667 回答