Authentication 使用单点登录和ADFS从SAML响应获取电子邮件地址

Authentication 使用单点登录和ADFS从SAML响应获取电子邮件地址,authentication,single-sign-on,saml,adfs,Authentication,Single Sign On,Saml,Adfs,我正在使用ADFS和SAML2.0设置单点登录(SSO)系统。我必须遵守以下我一直坚持的情景: 1) 用户试图访问web资源,但未登录,因此被定向到ADFS SSO服务 2) 用户成功地根据ADF进行身份验证 3) ADFS将SAML响应传递回web资源 4) web资源本身有一个用户数据库,但此处不存在该用户 5) 因此,web资源必须以静默方式创建用户帐户。为此,我需要电子邮件地址 那么,是否可以将ADFS配置为在成功的SAML响应消息中返回用户的电子邮件地址?您可以将ADFS配置为返回电子

我正在使用ADFS和SAML2.0设置单点登录(SSO)系统。我必须遵守以下我一直坚持的情景:

1) 用户试图访问web资源,但未登录,因此被定向到ADFS SSO服务

2) 用户成功地根据ADF进行身份验证

3) ADFS将SAML响应传递回web资源

4) web资源本身有一个用户数据库,但此处不存在该用户

5) 因此,web资源必须以静默方式创建用户帐户。为此,我需要电子邮件地址


那么,是否可以将ADFS配置为在成功的SAML响应消息中返回用户的电子邮件地址?

您可以将ADFS配置为返回电子邮件声明,前提是ADFS可以通过某种方式获取此信息(Active Directory或其他一些属性存储,可能是它可以访问的数据库?)并且假设您的应用程序设置为解密返回的令牌以读取内部声明

假设这是ADFS 2.0:

  • 将您的web资源设置为依赖方信任(听起来您已经这样做了)
  • 右键单击RP并选择编辑索赔规则…
  • 在“发布转换规则”选项卡上,为电子邮件地址添加新规则
  • 如果您可以从Active Directory获取电子邮件,因为您的用户正在通过域进行身份验证,那么您可以选择“将LDAP属性作为声明发送”规则模板

    否则,您将不得不选择“使用自定义规则发送索赔”,并设置自定义属性存储(到数据库或其他任何地方),并完成编写索赔规则的过程

    设置好后,在ASP.NET应用程序中,您需要将其配置为使用ADFS作为令牌颁发者。这是通过Microsoft.IdentityModel.dll和相关配置完成的。如果您已经安装了,那么在VisualStudio中应该有一些额外的选项,即如果您右键单击web项目,那么应该有一个“AddStsReference”选项。这将运行FedUtil,这是一个向导,将自动正确设置web.config。谷歌搜索如何设置东西

    现在您的站点正在使用ADF进行索赔,您需要做一些更改。在web.config的
    部分下,确保已将其设置为保存引导令牌(
    )。在您的代码中,您现在可以通过执行以下操作随时访问电子邮件声明:

    string email = (User.Identity as IClaimsIdentity).Claims.Where(c => c.ClaimType == ClaimTypes.Email).FirstOrDefault().Value;
    
    如果未将其设置为保存引导令牌,则那里的声明集合将为空


    不过,在这一过程中,可能还有很多其他因素会把事情搞得一团糟。希望这会让你走上正轨。

    我应该补充一点,用户使用电子邮件地址作为用户名登录。因为你说他们使用电子邮件登录,我假设他们不是域成员。在这种情况下,无论ADF使用什么来查找他们的电子邮件/密码组合,或者您需要访问的任何属性存储来填充声明值。我的web资源是ASP.net 4.0网站。我的理解是,ADFS方面的东西已经设置好了,并且以前用于Java实现。只是现在,它需要转换为.net 4.0。不幸的是,似乎没有人知道Java系统是如何工作的,但我认为我必须假设以前也会遇到同样的问题。请参阅我的编辑。我添加了一些关于如何从ASP.NET网站访问电子邮件声明的详细信息。因为听起来你的环境已经基本建立好了,你可以忽略这些部分,但我还是把它们放进去了,以防其他人偶然发现这个答案。