在生产环境中为您的网站设置 Microsoft .NET Passport 身份验证之前,您需要对 IIS 进行针对 .NET Passport 预生产服务器的测试。在完成这些过程后,则可确信 IIS 服务器和 .NET Passport 服务器之间能够正确通信,您的站点已注册了 .NET Passport(可能会涉及到签署表单和协议)以及您的网站具有正确的站点标识。对于要启用 .NET Passport 身份验证的每个网站,必须完成每个过程。
本主题包括下列信息:
要点 使用注册表编辑器不当可能导致需要重新安装操作系统的严重问题。因为注册表编辑器会跳过标准安全保护(禁止您输入存在冲突或者有可能降低性能或损坏系统的设置),所以在更改注册表时一定要格外小心。Microsoft 不能保证解决由于错误使用注册表编辑器而出现的问题。有关如何编辑注册表的信息,请参阅注册表编辑器帮助中的更改项和值主题。
在 Windows Server 2003 家族成员上启用 .NET Passport 身份验证后,默认 .NET Passport SecureLevel 设置为 10。这意味着使用 .NET Passport 身份验证(和默认设置)的新站点需要安全套接字层 (SSL) 服务器证书。可通过更改注册表值来更改站点的 SecureLevel 设置。
更改默认网站的 SecureLevel 设置
更改非默认网站以外任何网站的 SecureLevel 设置
注意 此文档应与 .NET Passport 软件开发工具包 (SDK) 文档(2.1 或更高版本)配合使用。如果尚未这样做,请查阅 SDK 文档,尤其是“如何实现 .NET Passport”一节。您可能会发现,浏览 Sample .NET Passport 网站非常有助于了解运行 .NET Passport 的站点的外观。也可以查阅代码示例,或者干脆将示例站点中的代码用作您自己站点的模板。可以从 MSDN Online 或 Sample .NET Passport 网站访问 .NET Passport SDK 帮助。
在您的网站上设置 .NET Passport 涉及针对以下三种 .NET Passport 环境测试和配置 IIS:
可通过检查 Passport 管理器管理工具中的“站点标识”字段,确定您的站点是否在默认的安装环境中。如果“站点标识”字段中的值为 1,则您的站点在默认安装环境中。当您的站点在此环境中时,可以对单次登录服务 (SSI) 进行初始评估,并针对 Passport 管理器对象测试站点上的任何动态内容。可以在注册您的站点或请求站点标识之前,或者在注册后等待站点标识和密钥的同时,开发网站和站点上的任何应用程序。在获得站点标识后,则没有理由再使用默认的安装环境了。此模式施加的限制仅用于禁止开发人员在签署必要的协议或合约之前访问某些 .NET Passport 功能。
注意 预生产环境要求使用 .NET Passport 预生产登录帐户。要设置预生产登录帐户,请参阅 Microsoft .NET Passport 成员服务注册。
以下是默认安装环境中的操作限制:
如果网站使用 Active Server Pages (ASP) 从 Passport 身份验证票据查询信息,则必须创建一个 Passport 管理器对象。Passport 管理器对象是用于 .NET Passport 单次登录和配置文件服务的服务器端对象。Passport 管理器对象使用 Cookie 和查询字符串数据作为媒介来查询中央用户存储。
要在 ASP 页中创建 Passport 管理器对象,请使用 ASP Server.
set oMgr = Server.CreateObject ("Passport.Manager")
在每个 ASP 页上只应创建一次 Passport 管理器对象。如果在单个页面上创建多个对象实例,则在该页面加载或卸载时可能会出现意外的结果。此外,多个实例产生了额外的内存开销以及对同一 Cookie 进行多次加密和解密,因而降低了性能。要保证只有一个实例,一种方法是仅在每个页面上包含的头文件中创建一次该对象。
不要在 ASP 应用程序中创建作用域为 Session 或 Application 的 Passport 管理器对象,除非明确将该实例用于 GetDomainAttribute 或 DomainFromMemberName(带有输入参数)等工具方法。
以下代码示例在 ASP 页中例示 Passport 管理器对象以便从 .NET Passport Cookie 获取用户信息。在默认安装环境中运行的网站返回常规值。在 PREP 或生产环境中运行的网站返回有效的用户信息。
%
'
' 例示 Passport 管理器
'
Set oMgr = Server.CreateObject ("Passport.Manager.1")
'
' 如果 SecureLevel > 1,则使用 https
'
thisURL = Server.URLEncode ("https://" & Request.ServerVariables ("SERVER_NAME") & Request.ServerVariables ("SCRIPT_NAME") ) signoutURL = Server.URLEncode ("https://" & Request.ServerVariables ("SERVER_NAME") & "/signout.asp")
If oMgr.IsAuthenticated(3600,FALSE) Then
'
' 将二进制 PUID 转换为十六进制格式以进行显示
'
strMemberIDHigh = oMgr.Profile("MemberIDHigh")
strMemberIDLow = oMgr.Profile("MemberIDLow")
strHex = Hex(strMemberIDHigh)
strPUID = String(8 - Len(strHex), "0") & strHex
strHex = Hex(strMemberIDLow)
strPUID = strPUID & String(8 - Len(strHex), "0") & strHex
有关的详细信息,请参阅 .NET Passport SDK(2.1 或更高版本)帮助中的“Passport 管理器方法”或“Passport 管理器属性”。
针对 .NET Passport 默认安装环境测试 ASP
注意 必须为 .NET Passport 默认安装和 PREP 环境配置用于测试 .NET Passport 的 Microsoft Windows XP 客户端计算机。要配置您的 Windows XP 客户端计算机以连接到这些环境,请参阅 .NET Passport SDK(2.1 或更高版本)帮助中的“.NET Passport SDK:系统要求”。尤其是要阅读“客户端计算机要求”一节。
在某些场合下(例如企业到企业 (B2B) 或企业到客户 (B2C)),可能需要设置特定网页或内容的访问控制列表 (ACL),然后授予选定成员或组使用 .NET Passport 身份验证访问该网页的权限。例如,拥有很多供应商的大公司为所有分支机构职员建立了考勤卡报告站点。通过设置联机考勤卡报告,供应商可以从任何 Web 浏览器访问该网页,而公司可以使用 Passport 身份验证来控制安全性。
为了设置此类 .NET Passport 身份验证(包含 ACL),.NET Passport 用户需要将 PUID 映射到 Active Directory® 目录服务中的帐户。Passport 票据包含该 PUID。PUID 到 Active Directory 中帐户的初始映射称为“供应”。“供应”在本主题的后文中介绍。
Active Directory 的 altSecurityIdentity 属性用于将 Passport 用户映射到 Active Directory 帐户。altSecurityIdentity 的值类似于:kerberos:0124ABCD78787878@domain.com。实质上,它是用户主体名称 (UPN),其中 PUID 是 UPN 前缀,而“@”后面的字符则是 UPN 后缀。UPN 后缀决定了映射所在的位置。UPN 前缀应该是创建映射所在的域或者是映射存在的域。换句话说,在示例映射 kerberos:0124ABCD78787878@domain.com 中,domain.com 是 UPN 后缀。可以在 IIS 身份验证对话框中对 UPN 后缀进行配置。UPN 后缀值与 IIS 身份验证对话框中配置的值必须相同,或者与服务器的域名相同。
IIS 配置数据库属性
要使 .NET Passport 映射正常工作,用于 IIS 工作进程的帐户必须满足以下条件:
以下 WMI 脚本在 IIS 配置数据库中设置 PassportRequireADMapping 标志:
dim g_PPADMapping : g_PPADMapping = 0
call ValidateArgs(WScript.Arguments)
Set g_Locator = CreateObject ("WbemScripting.SWbemLocator")
Set g_IIS = g_Locator.ConnectServer ("","root\MicrosoftIISv2","", "")
Set g_NodeObj = g_IIS.Get("IIsWebVirtualDirSetting ='" & WScript.Arguments(0) & "'")
g_NodeObj.PassportRequireADMapping.Value = g_PPADMapping
g_NodeObj.Put_
WScript.Echo WScript.Arguments(0) & "/PassportRequireADMapping changed to: " & g_PPADMapping
sub ValidateArgs(args)
if args.Count <> 2 then
call Usage
end if
if args(1) = "no" then
g_PPADMapping = 0
elseif args(1) = "try" then
g_PPADMapping = 1
elseif args(1) = "enforce" then
g_PPADMapping = 2
else
call Usage
end if
end sub
sub Usage
WScript.echo "Usage: " & WScript.ScriptName & " metabase_path no|try|enforce"
WScript.Echo "Example: " & WScript.ScriptName & """w3svc/1/root/passportvdir enforce"""
WScript.Echo " ------- Enforces mapping for virtual directory passportvdir"
WScript.Quit
end sub
要在网页上为 .NET Passport 身份验证设置 ACL,需要将 PUID 映射到 Active Directory 中的相应帐户,称为“供应”。本节中的示例代码向 Active Directory 帐户供应 PUID。要给 Active Directory 供应,您必须在 Active Directory 服务器上拥有管理员凭据。通常,此供应是由启用了 .NET Passport 的网页完成的,该网页收集有关该 .NET Passport 用户的信息,然后保存数据,以使管理员能够针对 Active Directory 执行供应。
以下示例代码来自于 Subscribe.asp。在启用 .NET Passport 的 ASP 页上使用此代码收集 .NET Passport 用户标识,以及使用 .NET Passport 映射创建 Active Directory 用户帐户。
%
'
' 例示 Passport 管理器
'
Set objPassportManager = Server.CreateObject ("Passport.Manager.1")
'
' 从 Passport 获取有关该用户的信息
'
strCurrentUserEmail = objPassportManager.Profile("PreferredEmail")
strMemberIDHigh = objPassportManager.Profile("MemberIDHigh")
strMemberIDLow = objPassportManager.Profile("MemberIDLow")
strHex = Hex(strMemberIDHigh)
'
' 将 PUID 转换为所需的格式
'
strPUID = String(8 - Len(strHex), "0") & strHex
strHex = Hex(strMemberIDLow)
strPUID = strPUID & String(8 - Len(strHex), "0") & strHex
strLastName = objPassportManager.Profile("LastName")
strFirstName = objPassportManager.Profile("FirstName")
'
' 连接到 AD 并查找默认域的默认命名上下文
'
set rootDSE = GetObject("LDAP://RootDSE")
if Err.Number <> 0 then
Response.Write "GetObject Error = " & Hex(Err.Number) & " (Source: " & Err.Source & ")"
end if
Err.Clear
strDomainDN = rootDSE.Get("defaultNamingContext")
if Err.Number <> 0 then
Response.Write "Get Domain DN Error = " & Hex(Err.Number) & " (Source: " & Err.Source & ")"
end if
Err.Clear
strdnsName = rootDSE.Get("dnsHostName")
FirstDot = Instr( strdnsName, "." )
strDomainName = Right( strdnsName, Len( strdnsName ) - FirstDot )
strContainerDN = "cn=users, " & strDomainDN
' 绑定到用户容器
set cont = GetObject("LDAP://" & strContainerDN )
if Err.Number <> 0 then
Response.Write "GetObject Users Container Error = " & Hex(Err.Number) & " (Source: " & Err.Source & ")"
end if
Err.Clear
' 创建用户帐户
Set user = cont.Create("user", "cn=" & strCurrentUserEmail)
if Err.Number <> 0 then
Response.Write "Create User Error = " & Hex(Err.Number) & " (Source: " & Err.Source & ")"
end if
user.put "samAccountName", strPUID
strFullAccountName = strPUID & "@" & strDomainName
user.put "altSecurityIdentities", "Kerberos:" & strFullAccountName
' 将用户的 UPN 设置为等于 PP 电子邮件地址
user.put "userPrincipalName", strCurrentUserEmail
user.put "givenName", Request.form("fname")(1)
user.put "sn", Request.form("lname")(1)
'
' 警告!!!
' 在将基于此示例代码的站点投入使用之前,
' 必须更改以下项目,
' 以给每个帐户分配随机密码。建议的方法是
' 使用 CAPICOM Utilities.GetRandom 函数。
'
user.put "userPassword", "89sd53ET!23kL"
' 写入属性缓存
user.SetInfo
' 刷新属性缓存
user.GetInfo
' 清除帐户禁用的标志并设置所需的标志
flags = user.get("userAccountControl")
flags = flags OR &H00010000
flags = flags AND &HFFFFFFFD
user.put "userAccountControl", flags
user.SetInfo
%
实际 .NET Passport 用户在 PREP 环境中可能并没有现有的电子邮件名称。站点的部分开发和测试工作可能要求在 PREP 环境中先创建一个用户存储,然后使用这些帐户针对站点代码的 .NET Passport 身份验证和配置文件访问部分进行测试。在 PREP 环境中运行服务的 .NET Passport 服务器代码与在生产环境中“实际”运行的代码基本相同;生产和 PREP 是一前一后发布的。这意味着,“投入使用”就仅是指停止当前在 PREP 环境中运行的站点上的服务器,重新配置这些服务器上的 Passport 管理器以便在生产环境中运行,然后重新启动这些服务器。
有关获取 PREP 站点标识的详细信息,请参阅 .NET Passport SDK(2.1 或更高版本)帮助中的“注册 .NET Passport 站点”。有关 PREP Passport 的详细信息,请参阅 .NET Passport SDK(2.1 或更高版本)帮助中的“获取 PREP Passport”和“登录到 PREP Passport”。另请参阅“投入使用:部署 Passport 管理器和站点代码”。
在完成注册过程后,就会出现一个确认页面,它指示您的新 .NET Passport 登录名。这是您在开发阶段使用的名称。
所有 Microsoft .NET Passport 用户在此环境中已有一个帐户。Microsoft® MSN® Internet Access 和 MSN Explorer 的用户以及直接在 Passport.com 网站注册的用户也在此环境中拥有 Passport。在生产环境中,站点可能要处理很多在各种其他 Passport 参与站点中已经过验证的实际 .NET Passport 用户。
要部署站点的 .NET Passport 代码,必须重新配置 Passport 管理器服务器端对象以便在生产环境中使用。为在生产环境中部署,您的站点还必须在生产环境中注册一个站点标识,并且还必须提供有关站点的某些配置信息(是生产部署所特有的配置信息)。要在生产环境中获得站点标识认可,.NET Passport 小组需要对您的站点 .NET Passport 实施情况进行一些基本的远程检查,并且还需要签署额外的一些约定或协议。
要点 不要将共同署名的 URL 放在启用 .NET Passport 身份验证的虚拟目录中。如果共同署名的 URL 位于启用 .NET Passport 身份验证的虚拟目录中,则在将共同署名的信息传递到客户端前,就会要求对客户端请求进行身份验证。这可能会导致以下情况:客户端无法验证和查看需要的页面。
要在 .NET Passport 生产环境中部署,请参阅 .NET Passport SDK(2.1 或更高版本)帮助中的“注册 Passport 网站”。要禁用默认安装环境并启用正常操作,请在“站点标识”字段中输入一个不同的站点标识并提交所做的更改。注意,如果将站点标识更改为 1 以外的其他值,则还必须安装匹配的加密密钥。仅在注册为 .NET Passport 参与站点时,才能获取密钥以及给任何特定参与站点分配的站点标识。
注意 确保还要为 .NET Passport 生产模式重新配置 Windows XP 客户端。有关的详细信息,请参阅 .NET Passport SDK(2.1 或更高版本)帮助中的“.NET Passport SDK:系统要求”。尤其是要阅读“客户端计算机要求”一节。
Microsoft Passport 管理器管理工具具有图形界面,可用于在更改 Passport 管理器对象设置时编辑注册表。Passport 管理器管理工具的最常见的用途是更改默认设置。有关如何设置默认值以及默认值如何影响 Passport 管理器方法的详细信息,请参阅 .NET Passport SDK 帮助中的“设置 Passport 管理器默认值”。
访问 Passport 管理器管理工具