HoloLens 中的共享Microsoft Entra帐户

共享Microsoft Entra (以前是 HoloLens 上的 Azure Active Directory) 帐户,是常规Microsoft Entra用户帐户,无需任何凭据即可登录到 HoloLens。 此设置非常适合满足以下条件的方案:

  • 多人共享同一组 HoloLens 设备
  • 需要访问Microsoft Entra资源,例如Dynamics 365 Guides内容
  • 不需要跟踪谁使用过设备。

使用共享Microsoft Entra帐户的主要优势

  • 简化的部署。 以前,设置多个人员之间共享的Microsoft Entra帐户需要手动设置每台设备。 共享Microsoft Entra帐户允许你配置环境一次,并自动部署到 Autopilot 中的任何设备。
  • 出色的用户体验。 共享Microsoft Entra帐户的用户无需输入任何凭据即可开始使用设备。 点击并转到!
  • 访问Microsoft Entra资源。 共享Microsoft Entra帐户的用户可以轻松访问Microsoft Entra资源,以便无需额外身份验证即可启动 Remote Assist 呼叫或打开指南。

重要

由于无需输入凭据即可在 HoloLens 设备上访问共享Microsoft Entra帐户,因此应以物理方式保护这些 HoloLens 设备,以便只有经过授权的人员才能访问。 你可能还希望通过应用条件访问策略、禁用自助密码重置,以及为使用这些帐户的设备配置分配的访问权限配置文件来锁定这些帐户。

注意

由于这些帐户是共享帐户,因此使用这些帐户的用户不会显示典型的首次登录设置屏幕,包括 PIN 和虹膜注册、生物识别数据收集通知和各种同意屏幕。 应确保通过策略为这些帐户配置适当的默认值 (请参阅快速) HoloLens 2设置用户,并且用户已了解这些默认值。

共享Microsoft Entra帐户的已知限制

  • 共享Microsoft Entra帐户无法使用 PIN 或 iris 在当前版本中登录,即使它们已注册也是如此。

共享Microsoft Entra帐户的概念概述

此过程允许为 HoloLens 设备分配用户帐户,并使用链接到设备和单独设备的凭据登录到该用户帐户。 此图描述了该过程:

共享帐户关系图

  1. Intune 具有 SCEP 服务的 SCEP 配置文件。
  2. 设备加入 Intune 并接收配置文件信息。
  3. 设备联系 SCEP 服务,并接收 UPN 为 的设备 HL-{Serial}@contoso.com证书。
  4. 设备使用证书作为 MFA 登录到 Entra ID 中的关联用户帐户,以提供无缝登录体验。

无法从设备中删除/导出证书,并且用户帐户配置为没有其他形式的 MFA 可用。 此配置可确保共享帐户只能由 HoloLens 设备登录。

配置共享Microsoft Entra帐户的步骤概述

HoloLens 上的共享Microsoft Entra帐户是作为常规Microsoft Entra用户帐户实现的,这些帐户配置为Microsoft Entra基于证书的身份验证 (CBA)

概括而言,配置共享Microsoft Entra帐户包括以下步骤:

  1. (推荐) 配置目标设备以使用 Autopilot 加入Microsoft Entra并注册到 Intune。
  2. 配置Microsoft Entra租户,为一组选定帐户启用 Microsoft Entra CBA
  3. 配置 Microsoft Intune 以将设备配置应用于一组选择的设备,这些设备:
    1. 通过 Intune 的 SCEP 证书配置文件将用于Microsoft Entra CBA 的客户端证书部署到设备上。
    2. 部署 CA 证书 ,使设备信任客户端证书的颁发者。
    3. 部署共享帐户配置,指示设备哪些证书对 Microsoft Entra CBA 有效。
  4. 为共享Microsoft Entra帐户准备单个设备

先决条件

内部预览版 10.0.22621.1217 开始提供共享 Microsoft HoloLens Microsoft Entra帐户支持。

除了在 HoloLens 上生成所需的操作系统外,还需要满足Microsoft Entra CBA (如何配置Microsoft Entra基于证书的身份验证) 的先决条件。

最后,需要访问 Microsoft Intune 才能部署设备配置和客户端证书。 有关通过 Intune 部署客户端证书所需的基础结构,请参阅了解Microsoft Intune支持的证书类型。 在此示例中,我们使用 SCEP 证书。

注意

有多个选项可用于部署 SCEP 证书,包括 Microsoft NDES 和 PKI。 对于 HoloLens,使用 Azure 服务处理证书注册可能更简单。 (Azure 市场中提供了多个选项,这使 HoloLens 共享的 Microsft Entra 帐户的配置与公司 PKI 隔离开来。

SCEP 服务的关键要求包括:

  1. 该服务可以接受来自Microsoft Intune的设备证书请求。
  2. 该服务可以使用定义的 EKU (客户端身份验证和智能卡登录) 生成证书。

强烈建议为 Autopilot 配置设备。 Autopilot 简化了最终用户的设备设置体验。

配置Microsoft Entra租户以启用 Microsoft Entra CBA

必须将Microsoft Entra租户配置为为选定用户组启用 Microsoft Entra CBA。

  1. 创建包含共享Microsoft Entra帐户的Microsoft Entra组。 例如,我们将名称“SharedAccounts”用于此组。
  2. 创建包含共享 HoloLens 设备的Microsoft Entra组。 例如,我们为此组使用名称“SharedDevices”。 稍后会为此组分配基于设备的 Intune 配置文件。
  3. SharedAccounts 组 (CBA) 启用Microsoft Entra基于证书的身份验证。 有关完整的分步指南,请参阅如何配置Microsoft Entra基于证书的身份验证。 若要进行此设置,需要执行以下高级步骤:
    1. 将 (证书颁发机构) CA 证书添加到 Microsoft Entra。 Microsoft Entra ID允许此 CA 颁发的客户端证书执行 CBA。
    2. 为“SharedAccounts”组启用 CBA。
    3. 配置 CBA,以便 CA 颁发的证书使用 MFA。 此步骤是为了确保用户可以访问需要 MFA 的资源,而无需设置其他因素。
    4. 通过 UserPrincipalName 启用证书绑定。

Intune 配置

必须将 Intune 配置为部署Microsoft Entra CBA 所需的证书。 Intune 还必须部署配置来指示设备哪些证书对 Microsoft Entra CBA 有效。

通过 SCEP 部署客户端证书

设备必须具有相应的客户端证书才能执行 CBA Microsoft Entra。 创建 SCEP 配置并将其分配给“SharedDevices”:

  1. 证书类型:设备

  2. (SAN) 添加用户主体名称 (UPN) 使用者可选名称 ,其中值是分配给设备的共享帐户的 UPN。 UPN 必须包含设备序列号才能将其与设备关联。 可以使用 Intune 变量 {{Device_Serial}} 来引用设备序列号。 例如,如果共享帐户的名称格式HL-123456789@contoso.com为 ,请输入 值HL-{{Device_Serial}}@contoso.com

  3. 密钥存储提供程序 (KSP) :选择“需要 TPM,否则失败”,以确保无法从设备导出证书以用于其他位置。

  4. 确保证书至少具有以下 扩展密钥用法 (EKU)

    • 智能卡登录:1.3.6.1.4.1.311.20.2.2
    • 客户端身份验证:1.3.6.1.5.5.7.3.2

    可以将其他 EKU 添加到此列表,以进一步限制允许Microsoft Entra CBA 的证书。 需要将这些 EKU 添加到 ConfigureSharedAccount 策略的 XML 中。

SCEP 配置示例

有关在 Intune 中配置 SCEP 的详细步骤,请参阅将 SCEP 证书配置文件与 Microsoft Intune配合使用

CA 证书部署

设备还必须信任颁发其客户端证书的 CA。 创建受信任的证书配置并将其分配给“SharedDevices”组。 此分配会将 CA 证书部署到设备。 请参阅文档:在 Microsoft Intune 中创建受信任的证书配置文件

ConfigureSharedAccount 策略

此策略告知设备哪些证书可用于Microsoft Entra CBA。 创建自定义设备配置策略并将其分配给“SharedDevices”:

策略 数据类型
./Vendor/MSFT/Policy/Config/MixedReality/ConfigureSharedAccount 字符串或字符串 (XML 文件)

示例配置:

<SharedAccountConfiguration>
    <SharedAccount>
        <!--
          TODO: Replace the example value below with your issuer certificate's thumbprint.
          You may customize the restrictions for which certificates are displayed. See below.
        -->
        <IssuerThumbprint>77de0879f69314d867bd08fcf2e8e6616548b3c8</IssuerThumbprint>
    </SharedAccount>
</SharedAccountConfiguration>

可以自定义为 Microsoft Entra CBA 显示证书的限制。 上面的示例要求颁发者的证书指纹与提供的值匹配。 还可以根据颁发者的名称应用限制,或者根据证书) 的扩展密钥用法 (EKU 应用更多限制。 有关如何配置 XML 的示例,请参阅 ConfigureSharedAccount XML 示例

保存此设备配置之前,请根据 ConfigureSharedAccount XML 架构 中指定的架构验证 XML,以确保其格式正常。

单个设备配置

对于要为共享Microsoft Entra帐户配置的每个 HoloLens 设备,请执行以下步骤:

  1. 使用通过 SCEP 部署客户端证书的步骤 2 中指定的格式创建Microsoft Entra用户。 例如:HL-123456789@contoso.com
  2. 将该用户添加到“SharedAccounts”组。
  3. 确保设备已添加到“SharedDevices”组。 应首先为 Autopilot 配置设备,使其已存在于Microsoft Entra中。

有关可用于自动执行此过程的 PowerShell 脚本示例,请参阅 示例设备设置 脚本。

测试配置

完成上述配置后,即可在 HoloLens 上试用共享Microsoft Entra帐户!

如果设备已配置为 Autopilot,请让设备通过正常的 Autopilot 流。 在 Autopilot 期间应用必要的设备配置。 完成 Autopilot 流后,会看到以下屏幕:

显示共享帐户的登录屏幕

点击“登录”按钮以开始使用共享Microsoft Entra帐户。

故障排除

问题:登录屏幕上未显示共享Microsoft Entra帐户!

解决 方案:首先,检查设备是否收到正确的证书。 打开证书管理器 (证书管理器) ,并确保将客户端证书和 CA 证书成功部署到设备。

对于客户端证书,请确保将其安装到“本地计算机”上的“我的”存储中。

显示证书位置的证书管理器

如果证书不存在,请按照 Intune SCEP 配置文件的故障排除步骤进行操作

如果证书存在,请确保证书在有效期内具有预期的颁发者和 EKU:

显示证书属性的证书管理器

接下来,确保应用于 MixedReality/ConfigureSharedAccount 的 XML 策略值格式正确。 可以使用 XSD) 验证程序联机 (众多 XML 架构之一来检查 XML 是否符合 ConfigureSharedAccount XML 架构中所述的架构。

问题:登录尝试失败!

解决 方案:检查是否按照如何配置Microsoft Entra基于证书的身份验证中的说明正确配置了 CBA。 此外,检查有关Microsoft Entra基于证书的身份验证的常见问题解答 (CBA) 常见问题解答。 有时,首先在 Windows 桌面设备上尝试以下调试步骤可能会有所帮助:使用Microsoft Entra基于证书的身份验证进行 Windows 智能卡登录

参考

ConfigureSharedAccount XML 架构

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="SharedAccountConfiguration">
    <xsd:complexType mixed="true">
      <xsd:sequence>
        <xsd:element minOccurs="1" maxOccurs="1" name="SharedAccount">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:choice>
                <xsd:element name="IssuerThumbprint">
                  <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                      <xsd:maxLength value="40" />
                    </xsd:restriction>
                  </xsd:simpleType>
                </xsd:element>
                <xsd:element name="IssuerName">
                  <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                      <xsd:maxLength value="512" />
                    </xsd:restriction>
                  </xsd:simpleType>
                </xsd:element>
              </xsd:choice>
              <xsd:element minOccurs="0" maxOccurs="1" name="EkuOidRequirements">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element maxOccurs="5" name="Oid">
                      <xsd:simpleType>
                        <xsd:restriction base="xsd:string">
                          <xsd:maxLength value="100" />
                        </xsd:restriction>
                      </xsd:simpleType>
                    </xsd:element>
                  </xsd:sequence>
                </xsd:complexType>
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

ConfigureSharedAccount XML 示例

要求颁发者证书的主题为 CN=yourCA,DC=Test:

<SharedAccountConfiguration>
    <SharedAccount>
        <IssuerName>CN=yourCA, DC=Test</IssuerName>
    </SharedAccount>
</SharedAccountConfiguration>

要求颁发者证书具有指定的指纹:

<SharedAccountConfiguration>
    <SharedAccount>
        <IssuerThumbprint>77de0879f69314d867bd08fcf2e8e6616548b3c8</IssuerThumbprint>
    </SharedAccount>
</SharedAccountConfiguration>

要求颁发者证书具有指定的指纹,并且客户端证书具有 OID 1.2.3.4.5.6 和 1.2.3.4.5.7 的 EKU:

<SharedAccountConfiguration>
    <SharedAccount>
        <IssuerThumbprint>77de0879f69314d867bd08fcf2e8e6616548b3c8</IssuerThumbprint>
        <EkuOidRequirements>
            <Oid>1.2.3.4.5.6</Oid>
            <Oid>1.2.3.4.5.7</Oid>
        </EkuOidRequirements>
    </SharedAccount>
</SharedAccountConfiguration>

始终需要 1.3.6.1.4.1.311.20.2.2 (智能卡登录) 和 1.3.6.1.5.5.7.3.2 (客户端身份验证) ,无论它们是否在此列表中。

示例设备设置脚本

在使用此示例设备设置脚本之前,应将引用从“contoso”更改为域名。

<#
.Synopsis
Configures a device for shared account

.Description
This script configures a device for shared account.

Note that you'll need to have the necessary permissions in your tenant to manage
user and device memberships and query Intune devices.

.Example
.\ConfigureSharedDevice.ps1 400064793157
#>


param (
    [Parameter(Mandatory = $true)]
    [string]
    # Serial number of the device. Typically a 12-digit numeric string.
    $DeviceSerialNumber,
    [string]
    # Group ID of the group that contains the shared accounts such as HL-123456789@contoso.com
    $SharedAccountGroupId,
    [string]
    # Group ID of the group that contains the shared devices
    $SharedDeviceGroupId
)

function Install-Dependencies {
    Write-Host -Foreground Cyan "Installing Dependencies..."

    if (!(Get-InstalledModule Microsoft.Graph -ErrorAction SilentlyContinue)) {
        Write-Host -Foreground Cyan "Installing Microsoft.Graph"
        Install-Module Microsoft.Graph -Scope CurrentUser -Repository 'PSGallery'
    }

    Write-Host -Foreground Cyan "Installing Dependencies... Done"
}

function New-PasswordString {
    $alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_-=+[]{}|;:,.<>/?'
    $length = 40
    $password = ""
    for ($i = 0; $i -lt $length; $i++) {
        $password += $alphabet[(Get-Random -Minimum 0 -Maximum $alphabet.Length)]
    }

    return $password
}

function New-SharedUser {
    param (
        $UserName,
        $DisplayName
    )

    # Does user already exist?
    $searchResult = Get-MgUser -Count 1 -ConsistencyLevel eventual -Search "`"UserPrincipalName:$UserName`""

    if ($searchResult.Count -gt 0) {
        Write-Host -Foreground Cyan "$UserName exists, using existing user."
        return $searchResult
    }

    $mailNickName = $UserName.Split('@')[0];

    Write-Host -Foreground Cyan "Creating $UserName"

    $passwordProfile = @{
        Password = New-PasswordString
    }

    return New-MgUser -AccountEnabled -DisplayName $DisplayName -Country US -UsageLocation US -MailNickname $mailNickName -UserPrincipalName $UserName -PasswordProfile $passwordProfile
}

function New-SharedUserForDevice {
    param (
        $DeviceSerialNumber
    )

    $userName = "HL-$DeviceSerialNumber@contoso.onmicrosoft.com"
    $displayName = "Shared HoloLens"

    return New-SharedUser -UserName $userName -DisplayName $displayName
}

function Add-UserToGroup {
    param (
        $UserId,
        $GroupId
    )

    $groupResult = Get-MgGroup -GroupId $GroupId
    if ($groupResult.Count -eq 0) {
        throw "Failed to find user group"
    }

    Write-Host -Foreground Cyan "Adding user ($UserId) to group"
    New-MgGroupMember -GroupId $GroupId -DirectoryObjectId $UserId
}

function Get-DeviceAADId {
    param (
        $DeviceSerialNumber
    )

    $deviceResult = Get-MgDeviceManagementManagedDevice | Where-Object { $_.SerialNumber -eq $DeviceSerialNumber }

    if ($deviceResult.Count -eq 0) {
        throw "Cannot find device with serial number $DeviceSerialNumber in Intune"
    }

    $result = ($deviceResult | Select-Object -First 1).AzureAdDeviceId

    Write-Host "Found device: $result"

    return $result
}

function Add-DeviceToGroup {
    param (
        $DeviceAADId,
        $GroupId
    )

    $groupResult = Get-MgGroup -GroupId $GroupId
    if ($groupResult.Count -eq 0) {
        throw "Failed to find device group"
    }

    $deviceResult = Get-MgDevice -Count 1 -ConsistencyLevel eventual -Search "`"DeviceId:$DeviceAADId`""
    if ($deviceResult.Count -eq 0) {
        throw "Failed to find device $DeviceAADId"
    }

    Write-Host -Foreground Cyan "Adding device $($deviceResult.Id) to group"
    
    New-MgGroupMember -GroupId $GroupId -DirectoryObjectId $deviceResult.Id
}

function Register-SharedDevice {
    param (
        $DeviceSerialNumber
    )

    Install-Dependencies

    Connect-MgGraph -Scopes "User.ReadWrite.All", "Group.Read.All", "GroupMember.ReadWrite.All", "DeviceManagementManagedDevices.Read.All", "Device.ReadWrite.All"

    $deviceAADId = Get-DeviceAADId $DeviceSerialNumber
    Add-DeviceToGroup $deviceAADId $SharedDeviceGroupId

    $user = New-SharedUserForDevice $DeviceSerialNumber
    Add-UserToGroup $user.Id $SharedAccountGroupId
}

Register-SharedDevice $DeviceSerialNumber