WEB开发网
开发学院操作系统windows 2008 使用 ADFS 跨组织验证用户 阅读

使用 ADFS 跨组织验证用户

 2008-11-20 12:44:01 来源:WEB开发网   
核心提示:本文讨论: 在单个组织中使用 ADFS 提供 SSO 在服务器和客户端配置 ADFS 连接到外部组织 使用 ADFS 进一步扩展信任关系 这篇文章部分基于 Windows Live ID 的预发布版,文中包含的详细信息均有变更可能,使用 ADFS 跨组织验证用户,本文使用了以下技术:ADFS, ADAM 目录 在单个组

本文讨论:

在单个组织中使用 ADFS 提供 SSO

在服务器和客户端配置 ADFS

连接到外部组织

使用 ADFS 进一步扩展信任关系

这篇文章部分基于 Windows Live ID 的预发布版。文中包含的详细信息均有变更可能。

本文使用了以下技术:

ADFS, ADAM

使用 ADFS 跨组织验证用户目录

在单个组织中使用 ADFS 提供 SSO

注册、身份验证和授权

创建 ADAM 帐户存储

配置 ADFS 服务器

配置 IIS 服务器和应用程序

导入证书

包含 UnderMyControl.com

添加资源合作伙伴

添加帐户合作伙伴

建立新用户

建立新资源

查询授予的权限

扩展信任关系至 Tailspin Toys

展望 — Windows Live ID 集成

总结

针对那些需要参与基于标准的身份联合验证的组织,Windows Server® 2003 引入了 Active Directory® 联合身份验证服务 (ADFS)。使用 ADFS 能够更轻松地验证来自其他组织的身份数据,从而大大提高与合作伙伴之间的互操作性。在本文中,我将借助虚构的在线服务提供商(A. Datum 公司)的经验,向您讲解 ADFS 的实际使用情况。该公司使用 ADFS 与真实的在线服务提供商 (UnderMyControl.com) 和虚构的客户 (Tailspin Toys) 进行交互。

在单个组织中使用 ADFS 提供 SSO

A. Datum 公司是一家在线服务提供商,向消费者提供两个 Web 应用程序。第一个 Web 应用程序可用于实现在线文档共享和存储;第二个应用程序为独立的艺术家提供在线音乐发布。A. Datum 没有采用两个单独的帐户存储(这要求用户记住每个应用程序的用户名和密码),而是使用 ADFS 和 ADAM(Active Directory 应用程序模式)创建单一帐户存储,用户只使用一组用户名和密码便可访问这两个应用程序。

在很多情况下,ADFS 服务器将充当帐户合作伙伴或资源合作伙伴的角色。充当帐户合作伙伴的 ADFS 服务器配置为与帐户存储(ADAM 或 Active Directory)交互,以验证用户。充当资源合作伙伴的 ADFS 服务器配置为支持那些 ADFS 感知应用程序。在这种情况下,ADFS 服务器同时提供对应用程序和帐户存储的访问。

ADAM 与 ADFS 的配合使用可以提供单一登录 (SSO),这样客户就无需记住多个密码。图 1 显示了 A. Datum 在其组织中部署此解决方案的方法。

使用 ADFS 跨组织验证用户

图 1单一登录解决方案

注意:Active Directory 服务器的出现只是因为 ADFS 服务器必须加入域。Active Directory 在此情形下不用于任何其他目的。

注册、身份验证和授权

当新用户注册使用文件存储或音乐发布服务时,他们会经历典型的注册过程:选择用户名、设置密码并提供背景资料信息。此信息随后会存储在 ADAM 帐户存储中,A. Datum 托管的所有应用程序均可据此对用户进行身份验证。图 2 显示了用于连接到 ADAM 的典型代码。

使用 ADFS 跨组织验证用户Figure2用于连接到 ADAM 的典型代码

const long ADS_OPTION_PASSWORD_PORTNUMBER = 6;
const long ADS_OPTION_PASSWORD_METHOD = 7;
const int ADS_PASSWORD_ENCODE_REQUIRE_SSL = 0;
const int ADS_PASSWORD_ENCODE_CLEAR = 1;
System.DirectoryServices.AuthenticationTypes AuthTypes =
  AuthenticationTypes.Signing |
  AuthenticationTypes.Sealing |
  AuthenticationTypes.Secure;
// connect to ADAM store
System.DirectoryServices.DirectoryEntry objUsers = new DirectoryEntry(
  "LDAP://10.0.0.212:389/cn=Users,dc=adamstore,dc=com",
  "ADATUMadministrator","Pa$$word!",AuthTypes);
// create user object
DirectoryEntry user = objUsers.Children.Add(
  "cn="+UsernameTB.Text, "user");
// set user properties
user.Properties["msDS-UserDontExpirePassword"].Value=true;
user.Properties["userPrincipalName"].Value = UsernameTB.Text;
user.CommitChanges();
// set port number, method, and password.
user.Invoke("SetOption", new object[] { ADS_OPTION_PASSWORD_PORTNUMBER,
  389 });
user.Invoke("SetOption", new object[] { ADS_OPTION_PASSWORD_METHOD,
  ADS_PASSWORD_ENCODE_CLEAR});
user.Invoke("SetPassword", new object[] { PasswordTB.Text });

用户在创建帐户之后,尝试访问文件存储或音乐发布服务时,Web 服务器会将其重定向到 ADFS 服务器。然后,ADFS 服务器会提示用户输入用户名和密码,接着与 ADAM 服务器通信以验证用户的凭据并确定组成员身份,向客户端颁发安全令牌,然后再将客户端重定向回 Web 应用程序。

安全令牌包含关于用户的身份和组成员身份的信息,这些信息称为声明。应用程序使用身份信息来确认用户已成功通过 ADFS 服务器的验证,并使用组成员身份信息来做出授权决定。例如,仅当用户的安全令牌中含有组声明 Musicians 时,A. Datum 的音乐应用程序才允许该用户上载音乐:

使用 ADFS 跨组织验证用户

// check if the user is a Musician and therefore has write (upload)
// permission
if (!User.IsInRole("Musicians"))
{
  // if the user doesn't have permission, show an error message
  Response.Clear();
  Response.Write("You do not have permission to upload files");
  return;
}

如果用户此时想访问 A. Datum 托管的其他应用程序,则无需重新输入凭据。这是因为用户已经拥有两个应用程序均信任的 ADFS 颁发的安全令牌。虽然 A. Datum 本可以使用其他技术为客户实现 SSO,但是 ADFS 允许公司只需通过添加额外的帐户和资源合作伙伴即可轻松扩展其信任关系。

创建 ADAM 帐户存储

要添加 ADAM 帐户存储,服务器必须运行 Windows Server 2003 R2,而且您必须以本地管理员权限登录。创建帐户存储首先要安装 ADAM,然后创建一个 ADAM 实例。安装 ADAM 要通过控制面板进行:选择“添加/删除程序”,然后选择“添加/删除 Windows 组件”。接下来,选中“Active Directory 服务”中的“Active Directory 应用程序模式 (ADAM)”复选框。安装 ADAM 之后,“开始”菜单中的“所有程序”菜单将包含“创建 ADAM 实例”项,请选择此项。出现提示时,选择一个唯一实例和新应用程序目录分区。创建 ADAM 实例后,即可使用 ADAM ADSI Edit 连接到该实例。您需要照此操作,因为这样才能为打算使用的帐户提供必要的权限。

配置 ADFS 服务器

要配置和运行 ADFS,首先必须安装 IIS。还必须使用 IIS 6 资源工具包 (go.microsoft.com/fwlink/?LinkId=36285) 中的 SelfSSL 工具,创建和安装自签名的 SSL 服务器身份验证证书。

接下来的步骤是通过选中“添加或删除程序”中的“联合身份验证服务”复选框来安装 ADFS。系统会提示您启用 ASP.NET,这也是 ADFS 正常工作所必需的。安装完成之后,可通过 Active Directory 联合身份验证服务管理单元来修改联合身份验证服务终结点(联合身份验证服务的 URL)和 URI(联合身份验证服务的唯一名称)。

现在可以添加 ADAM 帐户存储了。操作方法是:右键单击“帐户存储”并选择“新建”。向导会询问 ADAM 服务器名称、URI(代表 ADAM 存储的唯一名称)、搜索库可分辨的名称(用户帐户的位置),以及用于用户名的轻型目录访问协议 (LDAP) 属性(通常使用 userPrincipalName 属性)。

声明是 ADFS 在验证用户之后存储在用户安全令牌中的用户属性。组声明表示特定组内的成员身份。如果 ADAM 帐户存储中的某个用户帐户指出该用户是 Musicians 组的成员,那么 A. Datum 的 ADFS 服务器就会在该用户的安全令牌中放置组声明 Musicians。在 Active Directory 联合身份验证服务管理单元中,右键单击“组织声明”并选择“新建组织声明”。这将启动一个向导,让您选择声明的类型(组声明)并提供名称 (Musicians)。

通过创建组声明提取,可将 ADAM Musicians 组与刚创建的 Musicians 组声明联系起来。操作方法是:右键单击帐户存储并选择“新建组声明提取”。您将在这里指定代表组成员身份的 LDAP 属性。例如,您可以指定属性 memberof 和组 CN=Musicians、CN=Users、DC=adamstore、DC=com。您还将从一个下拉列表中选择刚创建的 Musicians 组声明。最后,要使 ADFS 服务能够意识到它将为其提供身份验证的应用程序,只需在 ADFS 管理单元中选择“新应用程序”并提供应用程序的 URL。

配置 IIS 服务器和应用程序

对于声明感知应用程序来说,只需对承载该应用程序的 IIS 服务器稍加配置。首先,需要在 IIS 服务器上安装服务器身份验证证书。这可以通过再次使用 IIS 6 资源工具包中的 SelfSSL 来完成。接下来,应该在“添加/删除 Windows 组件”中安装声明感知代理。最后,配置该应用程序以使用 ADFS 进行身份验证。对于声明感知应用程序(为使用 ADFS 进行身份验证而构建的应用程序)来说,与 ADFS 相关的所有配置都会在该应用程序的 web.config 文件中完成。图 3 显示了 A. Datum 的音乐共享应用程序中的 web.config 文件。

使用 ADFS 跨组织验证用户Figure3A. Datum 音乐共享应用程序的 Web.config 文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <configSections>
  <sectionGroup name="system.web">
   <section name="websso"
    type="System.Web.Security.SingleSignOn.WebSsoConfigurationHandler,
     System.Web.Security.SingleSignOn, Version=1.0.0.0,
     Culture=neutral,
     PublicKeyToken=31bf3856ad364e35, Custom=null" />
  </sectionGroup>
 </configSections>
 
<system.web>
 <sessionState mode="Off" />
 <compilation defaultLanguage="c#" debug="true">
 <assemblies>
  <add assembly="System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
    PublicKeyToken=B77A5C561934E089"/>
  <add assembly="System.Design, Version=2.0.0.0, Culture=neutral,
    PublicKeyToken=B03F5F7F11D50A3A"/>
  <add assembly="System.DirectoryServices, Version=2.0.0.0,
    Culture=neutral,
    PublicKeyToken=B03F5F7F11D50A3A"/>
  <add assembly="System.Web.Security.SingleSignOn, Version=1.0.0.0,
    Culture=neutral,
    PublicKeyToken=31bf3856ad364e35, Custom=null"/>
  <add assembly="System.Web.Security.SingleSignOn.ClaimTransforms,
    Version=1.0.0.0,
    Culture=neutral, PublicKeyToken=31bf3856ad364e35, Custom=null"/>
 </assemblies>
 </compilation>
 
 <customErrors mode="Off"/>
 <authentication mode="None" />
 
 <httpModules>
  <add name="Identity Federation Services Application
    Authentication Module"
    type="System.Web.Security.SingleSignOn.WebSsoAuthenticationModule,
    System.Web.Security.SingleSignOn, Version=1.0.0.0,
    Culture=neutral, PublicKeyToken=31bf3856ad364e35, Custom=null" />
 </httpModules>
 <websso>
  <authenticationrequired />
 
  <urls>
   <returnurl>https://www.adatum.com/Music/</returnurl>
  </urls>
 
  <cookies writecookies="true">
   <path>/Music</path>
  </cookies>
  <fs>https://adatum.ad.adatum.com/adfs/fs/
    federationserverservice.asmx</fs>
 </websso>
</system.web>
<system.diagnostics>
 <switches>
  <add name="WebSsoDebugLevel" value="255" />
 </switches>
 <trace autoflush="true" indentsize="3">
  <listeners>
   <add name="LSLogListener"
    type="System.Web.Security.SingleSignOn.BoundedSizeLogFileTrace
    Listener, System.Web.Security.SingleSignOn, Version=1.0.0.0,
    Culture=neutral,
    PublicKeyToken=31bf3856ad364e35, Custom=null" 
    initializeData="c:logdirclaimapp.log" />
  </listeners>
 </trace>
</system.diagnostics>
</configuration>

图 3 中有几个区域值得注意。注意 <configSections> 区段。段名 websso 指定了 ADFS SSO.dll,所以它可由 ASP.NET 加载。<assemblies> 段列出了多个项目,其中包括 ADFS 使用的 SingleSignOn 和 ClaimTransforms 程序集。

httpModules 段中声明的模块会截取所有 HTTPS 请求,以通过确保它是由资源联合身份验证服务签署的来进行身份验证。如果缺少有效的身份验证 cookie,此 httpModule 就会将客户端重定向到联合身份验证服务以进行身份验证。

在 <websso> 段中,请注意 <authenticationrequired/> 标记。如果没有此标记,将允许对站点进行匿名访问,这就需要依靠各个页面事件在授予访问权之前对安全令牌进行验证。HTTPmodule 仍将对身份验证 cookie 进行验证,但是如果缺少有效的身份验证 cookie,它不会将客户端重定向到联合身份验证服务。

在 <urls> 段中,可以指定 ADFS 服务器所用的 URL;在客户端经过身份验证之后,ADFS 服务器使用此 URL 将客户端重定向回应用程序。它还用于在将客户端重定向到 ADFS 服务器时标识该应用程序。此 URL 必须以正斜杠 (/) 结尾:

<urls>
<returnurl>https://www.adatum.com/Music/</returnurl>
</urls>

<cookies> 段由 ADFS 用于存储 ADFS 服务器颁发的客户端安全令牌:

<cookies writecookies="true">
<path>/Music</path>
</cookies>

最后,<fs> 标记指定联合身份验证服务 URL 的位置,以便应用程序能够成功验证用户请求。

导入证书

因为我们使用的是 A. Datum 的自签名证书,所以需要将该证书安装到正在使用的所有客户端和大多数服务器信任的根存储。如果只使用受信任根存储中已安装的证书颁发机构所颁发的证书,则可不必执行上述安装操作。可使用 Microsoft 管理控制台 (MMC) 的证书管理单元,将证书添加到受信任的根存储。图 4 列出了客户端、服务器和需要使用此步骤安装的证书。

使用 ADFS 跨组织验证用户Figure4需要的证书和设备

设备类型需要的证书
Web 应用程序服务器 (IIS)组织的 ADFS 服务的令牌签名证书。组织的 ADFS 服务器的服务器身份验证证书。
客户端计算机所有 ADFS 服务的令牌签名证书。所有 ADFS 服务器和 Web 应用程序服务器的服务器身份验证证书。
资源 ADFS 服务器所有帐户合作伙伴 ADFS 服务的令牌签名证书。

包含 UnderMyControl.com

A. Datum 1.0 版的应用程序具有非常简单的访问控制要求。对于音乐发布应用程序来说,用户无非是音乐家或音乐爱好者。音乐家可以上载音乐,其他人则可以下载其中的所有音乐。文件存储应用程序同样需要简单的访问要求。要么允许您上载和下载文档,要么只允许您下载文档。

在这些服务的 2.0 版中,A. Datum 希望大幅扩展文件共享应用程序的访问控制功能,并允许文档所有者为其他用户分配特定权限。譬如说,Bob 是某一文档的所有者,他可以为 Sue 分配读权限,为 Tom 分配读/写权限。这通常会要求 A. Datum 重新编写大量的应用程序逻辑,并创建许多新的 UI 元素,但是因为该公司已在使用 ADFS,所以它决定将其访问控制管理需求外包给 UnderMyControl.com 提供的 Web 服务,让用户可以管理资源的自定义访问控制列表。

您可以在图 5 中看到,UnderMyControl.com 也使用 ADFS,但在此处它只是将访问权授予其应用程序。通过将 A. Datum 添加为 UnderMyControl.com ADFS 服务器上受信任的帐户合作伙伴,将 UnderMyControl.com 添加为 A. Datum ADFS 服务器上受信任的资源合作伙伴,A. Datum 的用户即可使用 A. Datum 颁发的安全令牌访问 UnderMyControl.com。换句话说,用户无需使用另外的用户名和密码便可登录到 UnderMyControl.com。

使用 ADFS 跨组织验证用户

图 5外包访问控制管理

添加资源合作伙伴

为了建立必要的信任关系,A. Datum 将 UnderMyControl.com 添加为资源合作伙伴。这通过 ADFS MMC 管理单元来实现。具体方法是:右键单击“资源合作伙伴”并选择“新建资源合作伙伴”。在向导中,您需要提供 UnderMyControl.com ADFS 服务的 URL,并选择“联合的 Web SSO”(表示不涉及 Active Directory 信任关系)。

添加帐户合作伙伴

使用 UnderMyControl.com 作为资源合作伙伴配置完 A. Datum ADFS 服务器之后,通过将 A. Datum 添加为 UnderMy Control.com ADFS 服务器上的帐户合作伙伴,便可完成信任关系的建立。操作方法是:右键单击“帐户合作伙伴”并选择“新建”|“帐户合作伙伴”。此时,您需要提供 A. Datum ADFS 服务的 URL,并选择“联合的 Web SSO”。在创建 ADFS 服务信任的安全令牌时,还需提供 A. Datum 使用的令牌签名证书。

建立新用户

虽然用户帐户位于 A. Datum 的 ADAM 帐户存储中,UnderMyControl.com 仍需知悉所有用户,以便其他用户能够相互授权。这通过使用 Web 服务在 UnderMyControl.com 中创建用户配置文件来实现。当创建通过 ADFS 进行身份验证的用户时,不提供密码:

// connect to Under My Control web service
umc.Service svc = new umc.Service();
svc.CookieContainer = new System.Net.CookieContainer();
Session["CookieContainer"] = svc.CookieContainer;
// create a new UMC user
System.Guid userGuid;
svc.CreateAccount(UsernameTB.Text, "", "" , out userGuid);

因为 UnderMyControl.com 允许用户管理资源权限,所以对于那些可以被授予访问权限,也可以向其他用户授予访问权限的用户,UnderMyControl.com 需要其各自的配置文件;不过,A. Datum 帐户(用户名和密码)仅存储在 A. Datum 的 ADAM 服务器中。

建立新资源

当新文档或新歌曲上载到 A. Datum 的相应应用程序时,该应用程序会在 UnderMyControl.com 中创建一个关联的资源,并使用 UnderMyControl.com Web 服务设置默认权限,如图 6 所示。

使用 ADFS 跨组织验证用户Figure6创建关联的资源

// connect to the Under My Control web service
umc.Service svc = new umc.Service();
svc.CookieContainer =
  (System.Net.CookieContainer)Session["CookieContainer"];
// guid for the Under My Control music project
Guid projectGuid = new Guid("5f2739ff-a441-44fd-8c68-545a6d654e69");
// guid for the newly created resource
Guid resourceGuid;
        
// create new resource with name set to uploaded file name       
svc.CreateResource(FileUpload.FileName, projectGuid, out resourceGuid);
// Set the permissions for the resource
// add the user as an owner of the new resource
svc.AddOwnerToObject( (Guid)Session["User_GUID"], resourceGuid);
// UMC permission ids for this project
const int READ_PERMISSION = 13;
const int WRITE_PERMISSION = 14;
// give user read (aka download) and write permissions
svc.CreateACL( (Guid) Session["User_GUID"], resourceGuid,
  READ_PERMISSION);
svc.CreateACL( (Guid) Session["User_GUID"], resourceGuid,
  WRITE_PERMISSION);

查询授予的权限

当任一用户试图访问文档或歌曲时,A. Datum 应用程序首先在 UnderMyControl 服务中查询该用户被授予的权限,然后只允许那些获准的操作。图 7 显示了如何执行对资源的授权。

使用 ADFS 跨组织验证用户Figure7以编程方式连接到 UnderMyControl

// connect to the Under My Control web service
umc.Service svc = new umc.Service();
svc.CookieContainer =
  (System.Net.CookieContainer)Session["CookieContainer"];
// ID for WRITE_PERMISSION in UMC for this project
const int WRITE_PERMISSION = 14;
// check if the user has write permissions for the resource in UMC
bool hasPermission = false;
if(!svc.HasACL((Guid)Session["User_GUID"], resourceGuid,
  WRITE_PERMISSION, out hasPermission)||!hasPermission)
{
  // if the user doesn't have permission, show an error message
  Response.Clear();
  Response.Write(
    "You do not have permission to overwrite this file");
  return;
}

扩展信任关系至 Tailspin Toys

在具有增强的访问控制功能的文件共享应用程序 2.0 版发布后,消费者的兴致激增,公司的利润也随之攀升。让 A. Datum 出乎意料的是,公司发现自已与大型玩具制造商 Tailspin Toys 达成了为其提供文档管理的协议。Tailspin 想使用 A. Datum 的文档存储应用程序让雇员可以随时访问文档,并与同事、合作伙伴和客户共享这些文档。不过,Tailspin 不想要求每位雇员都创建一个 A. Datum 用户帐户,同时又要维护另一个用户名和密码。解决方案还是 ADFS。

A. Datum 将 Tailspin Toys 添加为帐户合作伙伴,允许其雇员使用他们的 Tailspin Toys 安全令牌访问 A. Datum 的应用程序,如图 8 所示。在 A. Datum ADFS 服务器和 Tailspin Toys ADFS 服务器上建立帐户和资源合作伙伴关系所用的操作步骤与建立同 UnderMyControl.com 的信任关系所用的步骤完全相同。

使用 ADFS 跨组织验证用户

图 8Tailspin Toys 和 A. Datum 实现

当然,出于讨论目的,Tailspin Toys 的部署已极度简化。在实际部署中,联合帐户验证服务器代理将用作包含 Active Directory 服务器的公司内网与面向外部的 ADFS 服务器之间的中介。有关使用联合帐户验证服务器代理的详细信息,请参阅 TechNet 网站上的“ADFS 设计和部署指南”。

展望 — Windows Live ID 集成

Tailspin Toys 被证明是将文档管理外包给 A. Datum 的众多组织中的第一家,这些组织都采用相同的 ADFS 配置。但是,随着 A. Datum 的不断成长,它认识到,许多客户都是使用 Office Live 承载其雇员帐户的小型公司。该公司还认识到,许多非公司用户已经拥有 Windows LiveTM ID 帐户。因为 Windows Live ID 将来必定会支持 ADFS,所以 A. Datum 认为,只要将 Windows Live ID 添加为另一个帐户合作伙伴,这两组用户最后肯定能够使用他们现有的用户帐户。图 9 显示了一个完整的设置。

使用 ADFS 跨组织验证用户

图 9A. Datum 和 Windows Live ID 实现

目前尚不支持使用 Windows Live ID 作为帐户合作伙伴。Microsoft Active Directory 联合身份验证服务产品团队和 Microsoft Windows Live ID 团队目前正在开发一项强大的集成功能,以便支持包括本部分列出的情形在内的各种情形。此集成功能将作为 ADFS 和 Windows Live ID 服务的未来版本的组成部分而得以实现。

总结

借助 ADFS,A. Datum 才得以在将信任关系扩大到其他组织方面享有更大的灵活性。这让 A. Datum 能够通过减少创建和维护多个用户帐户的麻烦,提供更加友好的用户体验。

Tags:使用 ADFS 组织

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接