基于声明的身份验证与Windows Identity Foundation

什么是Windows Identity Foundation (WIF)?

首先,Windows Identity Foundation是微软提供的一种利用基于声明的身份验证的方式。根据MSDN的定义,Windows Identity Foundation允许.NET开发者将身份逻辑从应用程序中分离出来,提高开发人员的生产力,增强应用程序的安全性,并实现互操作性。

通过使用WIF,开发者可以:

  • 提高生产力:使用相同的工具和编程模型来构建本地软件和云服务。
  • 增强安全性:减少自定义实现,使用基于声明的单一简化身份模型。
  • 提高灵活性:通过基于行业标准协议的互操作性,允许应用程序和身份基础设施服务通过声明进行通信。

简而言之,Windows Identity Foundation提供了一套类库,以便于实现基于声明的身份验证

使用WIF的先决条件

要使用WIF,需要Windows 2003服务器或更高版本,或者Windows 7/8/Vista。可以从以下链接下载WIF:

  • Windows Server 2003的WIF:
  • Windows 7+的WIF
  • WIF SDK:

WIF SDK提供了一些Visual Studio模板,有助于开发基于声明的应用程序。这些模板包括:

  • ASP.NET安全令牌服务网站
  • 基于声明的ASP.NET网站
  • 基于声明的WCF服务
  • WCF安全令牌服务

这些模板可以在文件菜单下的新建网站中找到。

示例:创建自定义身份提供者和ASP.NET应用程序

今天,将创建一个ASP.NET应用程序(依赖方应用程序-RP)。同时,将创建一个自定义身份提供者,并使用此身份提供者对用户进行身份验证。以下是需要执行的主要步骤:

  • 创建自定义身份提供者
  • 创建ASP.NET应用程序
  • 在身份提供者和ASP.NET应用程序(RP)之间创建信任关系

在这里,将逐步创建一个自定义身份提供者。

  1. 打开Visual Studio -> 创建新网站 -> 选择ASP.NET安全令牌服务网站(选择了HTTP位置,以便直接在IIS上托管它)。
  2. 现在示例身份提供者已创建。它为提供了基本的基础设施。它包括一个登录页面,该页面实际上对用户进行身份验证,这里使用了表单身份验证。

创建了一个ASP.NET应用程序,如下所示:

  1. 创建一个ASP.NET应用程序。
  2. 由于它已经创建了一个内置的身份验证模块,可以全部移除,因为不会使用它。或者,可以根据要求创建一个空的ASP.NET解决方案和一些页面。已经为演示移除了帐户文件夹。

这可以通过WIFSDK提供的FedUtil来完成。此外,从UI中,可以在ASP.NET网站中添加一个STS引用,并在身份提供者和依赖方之间建立信任关系。以下是添加引用的步骤:

  1. ASP.NET网站添加一个STS引用。
  2. 这是FedUtil的第一个屏幕,显示了ASP.NET网站(RP)的URI和位置:
  3. 如果没有在SSL上托管ASP.NET网站(RP),它将显示以下警告。在生产环境中,身份提供者和ASP.NET网站(RP)之间的所有通信都应仅通过SSL进行。在这里,为了演示目的,没有使用SSL。点击了“是”。
  4. 在这个屏幕上,它要求选择STS(安全令牌服务)。它有三个选项。由于已经创建了STS,需要选择“使用现有的STS”选项。
  5. 为了建立信任关系,需要提供身份提供者提供的联合元数据。
  6. 现在需要浏览创建的STS的FederationMetadata XML文件。FederationMetadata文件位于STS网站物理文件夹下的“FederationMetadata/2007-06”特殊文件夹层次结构中。
  7. 选择FederationMetadata。点击下一步。
  8. 再次,由于STS没有托管在SSL上,它显示了以下警告消息。只是点击了“是”。
  9. 这里它询问是否要加密令牌。在生产环境中应该加密。在这里,为演示选择了“不加密”选项。
  10. 现在它显示了STS传递给RP的所有声明。可以根据要求从STS传递更多的声明到RP。在添加STS引用时,所有声明都显示在这里。默认情况下,STS仅提供了两个角色(名称和角色)。
  11. 这是摘要屏幕,显示了有关STS和RP的详细信息。需要审查并点击完成。

注意:在这里有一个选项可以定期更新联合元数据。如果STS发生了变化,例如令牌或声明等,需要知道。RP只有在联合元数据更新时才会知道,否则,如果有人移除了一个声明并且元数据没有更新,它将允许获取该声明,但实际上在运行时将不会获得该声明,这将不是一个好情况。应该始终保持元数据的最新状态。

点击完成后,将向ASP.NET网站(依赖方-RP)添加一个名为FederationMetadata的文件夹,如下所示:

现在,如果运行应用程序,它将抛出一个异常,因为“由于代码已优化或调用堆栈顶部有一个本地帧,无法评估表达式。”这是一个问题,已经为此做了一个小帖子。可以轻松解决它。请查看。

更改后,它将顺利运行,并将带到由STS提供的登录页面。这是STS提供的默认登录页面,不需要输入密码,只需输入一个名称并点击登录,如下所示:

它将重定向到另一个页面到STS,这将实际启动创建令牌和声明的过程。创建完成后,它将作为经过身份验证的用户传输到网站。

现在应用程序正在运行。由于在STS中有一个使用表单身份验证的示例登录页面,默认情况下会验证每个用户。在这里,可以编写代码,无论否想使用Windows身份验证/表单身份验证来验证用户,并使用数据库,都可以,并且也可以获取一些用户的数据,例如从数据库中,然后可以按照要求使用声明发送。

现在,将展示如何向用户传递更多信息到声明中。所以,一个人可以在这里获得额外的声明。当创建一个STS时,会在App_Code文件夹中添加四个文件。一个名为CustomSecurityTokenService.cs的文件。在该文件中,有一个名为GetOutputClaimsIdentity的方法,它实际上创建了声明。需要在这里添加声明(添加了一些):

protected override IClaimsIdentity GetOutputClaimsIdentity(IClaimsPrincipal principal, RequestSecurityToken request, Scope scope) { if (null == principal) { throw new ArgumentNullException("principal"); } IClaimsIdentity claimsIdentity = (IClaimsIdentity)principal.Identities[0]; ClaimsIdentity outputIdentity = new ClaimsIdentity(); // Issue custom claims. Update the application's configuration file too to reflect new claims requirement. outputIdentity.Claims.Add(new Claim(System.IdentityModel.Claims.ClaimTypes.Name, principal.Identity.Name)); outputIdentity.Claims.Add(new Claim(ClaimTypes.Role, "Manager")); // I added these custom claims outputIdentity.Claims.Add(new Claim(ClaimTypes.Email, "brij@gmail.com")); outputIdentity.Claims.Add(new Claim(ClaimTypes.Gender, "Male")); return outputIdentity; }

添加了两个声明(Email,Gender),如上所示。这些声明将在ASP.NET网站(依赖方)中可用。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485