我们有一个ASP。NET (4.5) web应用程序,使用表单身份验证和自定义数据库来验证用户。我们的客户端使用ADFS活动目录联合服务,并希望使用ADFS用户登录到我们的web应用程序。我需要弄清楚如何将这些ADFS用户映射到应用程序自己的数据库中我们的自定义用户。当用户试图访问我的应用程序登录页面时,他们会被重定向到ADFS登录页面,一旦经过身份验证,就会返回到我的登录页面,同时返回一个对象,该对象可以访问有关经过身份验证的用户的一些信息,然后我需要将这些信息映射到我们的web应用程序中的用户。我真的很欣赏一个简单的代码示例,它可以用于此场景。特别需要关于用户/主体对象的信息或传递回来的东西,我可以用它来唯一地标识用户,可能是用户所属的组,而不是编写代码从我们的数据库中获取用户。我真的不想让web应用程序ADFS意识到,但我追求一些简单的东西。
你可以让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>
最后,您可以通过检索到的电子邮件(或其他声明)将用户映射到您的表。