一对一映射 <oneToOneMappings>
概述
<iisClientCertificateMappingAuthentication>
元素的 <oneToOneMappings>
元素将单个客户端证书一对一映射到单个用户帐户。 可以使用一对一证书映射来代替更常用的身份验证方法,例如 Windows 身份验证或基本身份验证。
注意
一对一证书映射不同于多对一证书映射,后者可将多个证书映射到单个用户帐户。
兼容性
版本 | 说明 |
---|---|
IIS 10.0 | <oneToOneMappings> 元素在 IIS 10.0 中未进行修改。 |
IIS 8.5 | <oneToOneMappings> 元素在 IIS 8.5 中未进行修改。 |
IIS 8.0 | <oneToOneMappings> 元素在 IIS 8.0 中未进行修改。 |
IIS 7.5 | <oneToOneMappings> 元素在 IIS 7.5 中未进行修改。 |
IIS 7.0 | IIS 7.0 中引入了 <iisClientCertificateMappingAuthentication> 元素的 <oneToOneMappings> 元素。 |
IIS 6.0 | <oneToOneMappings> 元素取代了 IIS 6.0 IIsCertMapper 元数据库对象。 |
安装
<iisClientCertificateMappingAuthentication>
元素在 IIS 7 及更高版本的默认安装中不可用。 若要安装它,请使用以下步骤。
Windows Server 2012 或 Windows Server 2012 R2
- 在任务栏上,单击 “服务器管理器”。
- 在“服务器管理器”中,单击“管理”菜单,然后单击“添加角色和功能”。
- 在“添加角色和功能”向导中,单击“下一步”。 选择安装类型,然后单击“下一步”。 选择目标服务器,然后单击“下一步”。
- 在“服务器角色”页上,依次展开“Web 服务器 (IIS)”、“Web 服务器”和“安全性”,然后选择“IIS 客户端证书映射身份验证”。 单击 “下一步” 。
。 - 在“选择功能”页上,单击“下一步”。
- 在“确认安装选择”页上,单击“安装”。
- 在“结果” 页面中单击“关闭” 。
Windows 8 或 Windows 8.1
- 在“开始”屏幕上,将指针一直移动到左下角,右键单击“开始”按钮,然后单击“控制面板”。
- 在“控制面板”中,单击“程序与功能”,然后单击“打开或关闭 Windows 功能”。
- 依次展开“Internet Information Services”、“万维网服务”和“安全性”,然后选择“IIS 客户端证书映射身份验证”。
- 单击“确定”。
- 单击“关闭” 。
Windows Server 2008 或 Windows Server 2008 R2
- 在任务栏上,单击“开始”,指向“管理工具”,然后单击“服务器管理器”。
- 在“服务器管理器”层次结构窗格中,展开“角色”,然后单击“Web 服务器 (IIS)”。
- 在“Web 服务器 (IIS)”窗格中,滚动到“角色服务”部分,然后单击“添加角色服务”。
- 在“添加角色服务向导”的“选择角色服务”页上,选择“IIS 客户端证书映射身份验证”,然后单击“下一步”。
- 在“确认安装选择”页中,单击“安装”。
- 在“结果” 页面中单击“关闭” 。
Windows Vista 或 Windows 7
- 在任务栏上,单击“开始”,然后单击“控制面板”。
- 在“控制面板”中,单击“程序与功能”,然后单击“打开或关闭 Windows 功能”。
- 展开“Internet Information Services”,然后选择“IIS 客户端证书映射身份验证”,然后单击“确定”。
操作方式
IIS 7 中没有用于配置 IIS 客户端证书映射身份验证的用户界面。 有关如何以编程方式配置 IIS 客户端证书映射身份验证的示例,请参阅本文档的代码示例部分。
配置
特性
无。
子元素
元素 | 说明 |
---|---|
add |
可选元素。 将一对一映射添加到一对一映射的集合。 |
clear |
可选元素。 从一对一映射集合中移除对一对一映射的所有引用。 |
配置示例
以下配置示例启用了使用默认网站的一对一证书映射的 IIS 客户端证书映射身份验证,为用户帐户创建单个一对一证书映射,并将站点配置为要求 SSL 并协商客户端证书。
<location path="Default Web Site">
<system.webServer>
<security>
<access sslFlags="Ssl, SslNegotiateCert" />
<authentication>
<windowsAuthentication enabled="false" />
<anonymousAuthentication enabled="false" />
<digestAuthentication enabled="false" />
<basicAuthentication enabled="false" />
<iisClientCertificateMappingAuthentication enabled="true"
oneToOneCertificateMappingsEnabled="true">
<oneToOneMappings>
<add enabled="true"
userName="administrator"
password="[enc:57686f6120447564652c2049495320526f636b73:enc]"
certificate="Base64-Encoded-Certificate-Data" />
</oneToOneMappings>
</iisClientCertificateMappingAuthentication>
</authentication>
</security>
</system.webServer>
</location>
如何从客户端证书检索 Base-64 编码字符串
注意
若要检索本主题中所有示例的 Base-64 编码证书数据,可以使用以下步骤导出证书:
单击“开始”,然后单击“运行”。
键入 MMC,然后单击“确定”。
当 Microsoft 管理控制台打开时,单击“文件”,然后单击“添加/删除管理单元”。
在“添加或移除管理单元”对话框中:
- 突出显示可用管理单元列表中的“证书”,然后单击“添加”。
- 选择以管理“我的用户帐户”的证书,然后单击“完成”。
- 单击 “确定” 关闭对话框。
在“Microsoft 管理控制台”中:
- 依次展开“证书 - 当前用户”、“个人”和“证书”。
- 在证书列表中,右键单击要导出的证书,然后单击“所有任务”和“导出”。
当“证书导出向导”打开时:
- 单击 “下一步” 。
- 选择“不,不导出私钥”,然后单击“下一步”。
- 选择“Base-64 编码的 X.509 9 (.CER)”作为导出格式,然后单击“下一步”。
- 选择将证书保存到桌面并命名为“MyCertificate.cer”,然后单击“下一步”。
- 单击“完成”;应看到一个对话框,提示导出成功。
关闭 Microsoft 管理控制台。
使用 Windows 记事本打开导出的 MyCertificate.cer 文件:
- 移除文本开头的“-----BEGIN CERTIFICATE-----”。
- 移除文本末尾的“-----END CERTIFICATE-----”。
- 将所有行连接成一行文本,这是用于本主题中所有示例的 Base-64 编码证书数据。
代码示例
以下代码示例启用了使用默认网站的一对一证书映射的 IIS 客户端证书映射身份验证,为用户帐户创建单个一对一证书映射,并将站点配置为要求 SSL 并协商客户端证书。
注意
若要检索下面列出的代码示例的 Base-64 编码证书数据,可以使用本文档的“配置详细信息”部分中列出的步骤导出证书。
AppCmd.exe
注意
由于 AppCmd.exe 无法分析证书字符串中的某些字符,因此不应使用 AppCmd.exe 来配置 IIS 一对一证书映射。
C#
using System;
using System.Text;
using Microsoft.Web.Administration;
internal static class Sample
{
private static void Main()
{
using (ServerManager serverManager = new ServerManager())
{
Configuration config = serverManager.GetApplicationHostConfiguration();
ConfigurationSection iisClientCertificateMappingAuthenticationSection = config.GetSection("system.webServer/security/authentication/iisClientCertificateMappingAuthentication", "Default Web Site");
iisClientCertificateMappingAuthenticationSection["enabled"] = true;
iisClientCertificateMappingAuthenticationSection["oneToOneCertificateMappingsEnabled"] = true;
ConfigurationElementCollection oneToOneMappingsCollection = iisClientCertificateMappingAuthenticationSection.GetCollection("oneToOneMappings");
ConfigurationElement addElement = oneToOneMappingsCollection.CreateElement("add");
addElement["enabled"] = true;
addElement["userName"] = @"Username";
addElement["password"] = @"Password";
addElement["certificate"] = @"Base-64-Encoded-Certificate-Data";
oneToOneMappingsCollection.Add(addElement);
ConfigurationSection accessSection = config.GetSection("system.webServer/security/access", "Default Web Site");
accessSection["sslFlags"] = @"Ssl, SslNegotiateCert";
serverManager.CommitChanges();
}
}
}
VB.NET
Imports System
Imports System.Text
Imports Microsoft.Web.Administration
Module Sample
Sub Main()
Dim serverManager As ServerManager = New ServerManager
Dim config As Configuration = serverManager.GetApplicationHostConfiguration
Dim iisClientCertificateMappingAuthenticationSection As ConfigurationSection = config.GetSection("system.webServer/security/authentication/iisClientCertificateMappingAuthentication", "Default Web Site")
iisClientCertificateMappingAuthenticationSection("enabled") = True
iisClientCertificateMappingAuthenticationSection("oneToOneCertificateMappingsEnabled") = True
Dim oneToOneMappingsCollection As ConfigurationElementCollection = iisClientCertificateMappingAuthenticationSection.GetCollection("oneToOneMappings")
Dim addElement As ConfigurationElement = oneToOneMappingsCollection.CreateElement("add")
addElement("enabled") = True
addElement("userName") = "Username"
addElement("password") = "Password"
addElement("certificate") = "Base-64-Encoded-Certificate-Data"
oneToOneMappingsCollection.Add(addElement)
Dim accessSection As ConfigurationSection = config.GetSection("system.webServer/security/access", "Default Web Site")
accessSection("sslFlags") = "Ssl, SslNegotiateCert"
serverManager.CommitChanges()
End Sub
End Module
JavaScript
var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";
var iisClientCertificateMappingAuthenticationSection = adminManager.GetAdminSection("system.webServer/security/authentication/iisClientCertificateMappingAuthentication", "MACHINE/WEBROOT/APPHOST/Default Web Site");
iisClientCertificateMappingAuthenticationSection.Properties.Item("enabled").Value = true;
iisClientCertificateMappingAuthenticationSection.Properties.Item("oneToOneCertificateMappingsEnabled").Value = true;
var oneToOneMappingsCollection = iisClientCertificateMappingAuthenticationSection.ChildElements.Item("oneToOneMappings").Collection;
var addElement = oneToOneMappingsCollection.CreateNewElement("add");
addElement.Properties.Item("enabled").Value = true;
addElement.Properties.Item("userName").Value = "Username";
addElement.Properties.Item("password").Value = "Password";
addElement.Properties.Item("certificate").Value = "Base-64-Encoded-Certificate-Data";
oneToOneMappingsCollection.AddElement(addElement);
var accessSection = adminManager.GetAdminSection("system.webServer/security/access", "MACHINE/WEBROOT/APPHOST/Default Web Site");
accessSection.Properties.Item("sslFlags").Value = "Ssl, SslNegotiateCert";
adminManager.CommitChanges();
VBScript
Set adminManager = WScript.CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"
Set iisClientCertificateMappingAuthenticationSection = adminManager.GetAdminSection("system.webServer/security/authentication/iisClientCertificateMappingAuthentication", "MACHINE/WEBROOT/APPHOST/Default Web Site")
iisClientCertificateMappingAuthenticationSection.Properties.Item("enabled").Value = True
iisClientCertificateMappingAuthenticationSection.Properties.Item("oneToOneCertificateMappingsEnabled").Value = True
Set oneToOneMappingsCollection = iisClientCertificateMappingAuthenticationSection.ChildElements.Item("oneToOneMappings").Collection
Set addElement = oneToOneMappingsCollection.CreateNewElement("add")
addElement.Properties.Item("enabled").Value = True
addElement.Properties.Item("userName").Value = "Username"
addElement.Properties.Item("password").Value = "Password"
addElement.Properties.Item("certificate").Value = "Base-64-Encoded-Certificate-Data"
oneToOneMappingsCollection.AddElement(addElement)
Set accessSection = adminManager.GetAdminSection("system.webServer/security/access", "MACHINE/WEBROOT/APPHOST/Default Web Site")
accessSection.Properties.Item("sslFlags").Value = "Ssl, SslNegotiateCert"
adminManager.CommitChanges()