Delen via


Beveiligde verbinding met Holographic Remoting en de OpenXR API

Wanneer u de OpenXR-API gebruikt, is alle beveiligde verbindingsgerelateerde API beschikbaar als onderdeel van de XR_MSFT_holographic_remoting OpenXR-extensie.

Belangrijk

Voor meer informatie over de Holographic Remoting OpenXR-extensie-API, bekijkt u de specificatie die te vinden is in de GitHub-opslagplaats holographic Remoting-voorbeelden.

Houd er rekening mee dat u aangepaste externe apps en speler-apps moet implementeren als u verbindingsbeveiliging wilt inschakelen. Beide aangepaste apps hebben het volgende nodig:

  • Een certificaatprovider en een verificatievalidator als de app wordt uitgevoerd als de server.
  • Een verificatieprovider en een certificaatvalidator als de app wordt uitgevoerd als de client.

De OpenXR-API is vergelijkbaar met de Windows Mixed Reality-API die hier wordt beschreven. In plaats van interfaces te implementeren, zijn de volgende callbacks echter de belangrijkste elementen voor beveiligde verbinding met behulp van de XR_MSFT_holographic_remoting OpenXR-extensie:

  • xrRemotingRequestAuthenticationTokenCallbackMSFT, genereert of haalt het verificatietoken op dat moet worden verzonden.
  • xrRemotingValidateServerCertificateCallbackMSFT, valideert de certificaatketen.
  • xrRemotingValidateAuthenticationTokenCallbackMSFT, valideert het clientverificatietoken.
  • xrRemotingRequestServerCertificateCallbackMSFT, geeft u de servertoepassing het certificaat op dat u wilt gebruiken.

Notitie

Met Holographic Remoting is het mogelijk dat de speler of de afstandsbediening de server is, afhankelijk van uw behoeften (zie Holographic Remoting Terminologie voor meer informatie). Als uw aangepaste externe of aangepaste spelertoepassing kan worden uitgevoerd als client en server, moet de app alle vier callbacks bieden.

De callbacks kunnen worden verstrekt aan de externe OpenXR-runtime via xrRemotingSetSecureConnectionClientCallbacksMSFT en xrRemotingSetSecureConnectionServerCallbacksMSFT. Hiervoor kunt u statische functies maken voor de callbacks:

class SecureConnectionCallbacks {
public:
    ...

    // Static callbacks
    static XrResult XRAPI_CALL
    RequestAuthenticationTokenStaticCallback(XrRemotingAuthenticationTokenRequestMSFT* authenticationTokenRequest) {
        if (!authenticationTokenRequest->context) {
            return XR_ERROR_RUNTIME_FAILURE;
        }
        return reinterpret_cast<SecureConnectionCallbacks*>(authenticationTokenRequest->context)
            ->RequestAuthenticationToken(authenticationTokenRequest);
    }

    static XrResult XRAPI_CALL
    ValidateServerCertificateStaticCallback(XrRemotingServerCertificateValidationMSFT* serverCertificateValidation) {
        if (!serverCertificateValidation->context) {
            return XR_ERROR_RUNTIME_FAILURE;
        }
        return reinterpret_cast<SecureConnectionCallbacks*>(serverCertificateValidation->context)
            ->ValidateServerCertificate(serverCertificateValidation);
    }

    static XrResult XRAPI_CALL
    ValidateAuthenticationTokenStaticCallback(XrRemotingAuthenticationTokenValidationMSFT* authenticationTokenValidation) {
        if (!authenticationTokenValidation->context) {
            return XR_ERROR_RUNTIME_FAILURE;
        }
        return reinterpret_cast<SecureConnectionCallbacks*>(authenticationTokenValidation->context)
            ->ValidateAuthenticationToken(authenticationTokenValidation);
    }

    static XrResult XRAPI_CALL
    RequestServerCertificateStaticCallback(XrRemotingServerCertificateRequestMSFT* serverCertificateRequest) {
        if (!serverCertificateRequest->context) {
            return XR_ERROR_RUNTIME_FAILURE;
        }
        return reinterpret_cast<SecureConnectionCallbacks*>(serverCertificateRequest->context)
            ->RequestServerCertificate(serverCertificateRequest);
    }
}

De statische callback-functies zien er allemaal hetzelfde uit en in het bovenstaande voorbeeld roepen ze alleen een functie aan op het contextobject, dat is ingesteld in xrRemotingSetSecureConnectionClientCallbacksMSFT of xrRemotingSetSecureConnectionServerCallbacksMSFT. De daadwerkelijke implementatie van de callbacks wordt vervolgens uitgevoerd binnen de lidfuncties van het contextobject:

class SecureConnectionCallbacks {   
    ...

private:
    // The client has to provide a token and has to validate the certificate.
    XrResult RequestAuthenticationToken(XrRemotingAuthenticationTokenRequestMSFT* authenticationTokenRequest) {
        // To provide a token fill out the authenticationTokenRequest with your token.
    }
    XrResult ValidateServerCertificate(XrRemotingServerCertificateValidationMSFT* serverCertificateValidation) {
        // Validate the certificate.
    }

    // The server has to provide a certificate and hast to validate the token.
    XrResult ValidateAuthenticationToken(XrRemotingAuthenticationTokenValidationMSFT* authenticationTokenValidation) {
        // Validate the token.
    }
    XrResult RequestServerCertificate(XrRemotingServerCertificateRequestMSFT* serverCertificateRequest) {
        // To provide a certificate fill out the serverCertificateRequest with your certificate.
    }
}

U kunt nu de callbacks opgeven voor xrRemotingSetSecureConnectionClientCallbacksMSFT en xrRemotingSetSecureConnectionServerCallbacksMSFT. Bovendien moet de beveiligde verbinding worden ingeschakeld via de parameter secureConnection in de XrRemotingConnectInfoMSFT structuur of de XrRemotingListenInfoMSFT structuur, afhankelijk van of u of xrRemotingListenMSFTgebruiktxrRemotingConnectMSFT:

...

SecureConnectionCallbacks callbackObject;

...

if (client) 
{
    XrRemotingSecureConnectionClientCallbacksMSFT clientCallbacks{static_cast<XrStructureType>(XR_TYPE_REMOTING_SECURE_CONNECTION_CLIENT_CALLBACKS_MSFT);
    clientCallbacks.context = &callbackObject;
    clientCallbacks.requestAuthenticationTokenCallback = SecureConnectionCallbacks::RequestAuthenticationTokenStaticCallback;
    clientCallbacks.validateServerCertificateCallback = SecureConnectionCallbacks::ValidateServerCertificateStaticCallback;
    clientCallbacks.performSystemValidation = true;
    CHECK_XRCMD(m_extensions.xrRemotingSetSecureConnectionClientCallbacksMSFT(m_instance.Get(), m_systemId, &clientCallbacks));
    
    ...

    connectInfo.secureConnection = true; // Enable secure connection!
    CHECK_XRCMD(m_extensions.xrRemotingConnectMSFT(m_instance.Get(), m_systemId, &connectInfo));
}

if (server) 
{
    XrRemotingSecureConnectionServerCallbacksMSFT serverCallbacks{static_cast<XrStructureType>(XR_TYPE_REMOTING_SECURE_CONNECTION_SERVER_CALLBACKS_MSFT);
    serverCallbacks.context = &callbackObject;
    serverCallbacks.requestServerCertificateCallback = SecureConnectionCallbacks::RequestServerCertificateStaticCallback;
    serverCallbacks.validateAuthenticationTokenCallback = SecureConnectionCallbacks::ValidateAuthenticationTokenStaticCallback;
    serverCallbacks.authenticationRealm = /*YourAuthenticationRealm*/;
    CHECK_XRCMD(m_extensions.xrRemotingSetSecureConnectionServerCallbacksMSFT(m_instance.Get(), m_systemId, &serverCallbacks));

    ...

    listenInfo.secureConnection = true; // Enable secure connection!
    CHECK_XRCMD(m_extensions.xrRemotingListenMSFT(m_instance.Get(), m_systemId, &listenInfo));
}

Notitie

U vindt een gedetailleerd voorbeeld in de OpenXR-voorbeeld-app.

Zie ook