Aracılığıyla paylaş


Holographic Uzaktan İletişim ve OpenXR API'siyle Güvenli Bağlantı

OpenXR API'sini kullanırken, bağlantıyla ilgili tüm güvenli API OpenXR uzantısının XR_MSFT_holographic_remoting bir parçası olarak kullanılabilir.

Önemli

Holographic Remoting OpenXR uzantı API'sini öğrenmek için Holographic Remoting örnekleri github deposunda bulunan belirtimlere göz atın.

Bağlantı güvenliğini etkinleştirmek istiyorsanız özel uzak ve oynatıcı uygulamaları uygulamanız gerektiğini unutmayın. Her iki özel uygulamanın da ihtiyacı:

  • Uygulama sunucu olarak çalışıyorsa bir sertifika sağlayıcısı ve kimlik doğrulama doğrulayıcısı.
  • Uygulama istemci olarak çalışıyorsa bir kimlik doğrulama sağlayıcısı ve sertifika doğrulayıcı.

OpenXR API'si, burada açıklanan Windows Mixed Reality API'sine benzer. Ancak, arabirimleri uygulamak yerine OpenXR uzantısını kullanarak güvenli bağlantı için XR_MSFT_holographic_remoting temel öğeler aşağıdaki geri çağırmalardır:

  • xrRemotingRequestAuthenticationTokenCallbackMSFT, gönderilecek kimlik doğrulama belirtecini oluşturur veya alır.
  • xrRemotingValidateServerCertificateCallbackMSFT, sertifika zincirini doğrular.
  • xrRemotingValidateAuthenticationTokenCallbackMSFT, istemci kimlik doğrulama belirtecini doğrular.
  • xrRemotingRequestServerCertificateCallbackMSFT, sunucu uygulamasına kullanılacak sertifikayı sağlayın.

Not

Holographic Remoting ile ihtiyaçlarınıza bağlı olarak Sunucu Oynatıcı veya Uzak sunucu olabilir (Daha fazla bilgi için bkz. Holographic Uzaktan İletişim Terminolojisi). Özel uzak veya özel oynatıcı uygulamanız istemci ve sunucu olarak çalıştırılabilirse uygulamanın dört geri çağırmanın tümünü sağlaması gerekir.

Geri çağırmalar ve xrRemotingSetSecureConnectionServerCallbacksMSFTaracılığıyla xrRemotingSetSecureConnectionClientCallbacksMSFT uzaktan iletişim OpenXR çalışma zamanına sağlanabilir. Bunu yapmak için geri çağırmalar için statik işlevler oluşturabilirsiniz:

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);
    }
}

Statik geri çağırma işlevlerinin tümü benzer görünür ve yukarıdaki örnekte yalnızca veya xrRemotingSetSecureConnectionServerCallbacksMSFTiçinde ayarlanan bağlam nesnesinde xrRemotingSetSecureConnectionClientCallbacksMSFT bir işlev çağırırlar. Geri çağırmaların gerçek uygulaması daha sonra bağlam nesnesinin üye işlevlerinde gerçekleştirilir:

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.
    }
}

Artık ve xrRemotingSetSecureConnectionServerCallbacksMSFTiçin geri çağırmaları xrRemotingSetSecureConnectionClientCallbacksMSFT sağlayabilirsiniz. Ayrıca, güvenli bağlantının, veya kullanıp kullanmadığınıza xrRemotingConnectMSFTxrRemotingListenMSFTbağlı olarak yapı veya XrRemotingListenInfoMSFT yapı üzerindeki XrRemotingConnectInfoMSFT secureConnection parametresi aracılığıyla etkinleştirilmesi gerekir:

...

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));
}

Not

Ayrıntılı bir örneği OpenXR örnek uygulamasında bulabilirsiniz.

Ayrıca Bkz.