我们有一个ASP.NET(4.5)Web应用程序,使用Forms身份验证和自定义数据库来验证用户。我们的客户端使用ADFS Active Directory联合身份验证服务,并希望使用ADFS用户登录我们的Web应用程序。我需要弄清楚如何将这些ADFS用户映射到应用程序自己的数据库中的自定义用户。 当用户尝试访问我的应用程序登录页面时,他们会被重新定向到ADFS登录页面,一旦经过身份验证,就会返回到我的登录页面以及一个对象,该对象可以访问有关经过身份验证的用户的一些信息,然后我需要将其映射到用户在我们的网络应用程序 我非常感谢可以在这种情况下使用的简单代码示例。特别需要有关用户/主体对象的信息,或者我可以使用哪些信息来唯一地标识用户以及可能用户所属的组,而不是编写我的代码以从我们的数据库中获取用户。我真的不想让网络应用程序ADFS知道,但我在简单的事情之后。这适用于这种情况。
答案 0 :(得分:0)
您可以让ADFS返回有助于识别用户身份的其他声明,例如:电子邮件 - 有关详情,请参阅此answer。 配置完成后,在控制器中使用以下代码来获取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>
最后,您可以通过检索到的电子邮件(或其他声明)将用户映射到您的表格。