如何︰使用 ADAL 驗證

重要

2020 年 3 月之前發行的 Microsoft Rights Management Service SDK 版本已被取代;使用舊版的應用程式必須更新為使用 2020 年 3 月版本。 如需完整詳細資料,請參閱 淘汰通知

Microsoft Rights Management Service SDK 沒有進一步的增強功能。 我們強烈建議採用Microsoft 資訊保護 SDK來分類、標記和保護服務。

使用 Azure Active Directory Authentication Library (ADAL) 向 Azure RMS 驗證您的應用程式。

藉由更新應用程式來使用 ADAL 驗證而不是 Microsoft Online 登入小幫手,您和您的客戶將能夠︰

  • 利用多重要素驗證
  • 安裝 RMS 2.1 用戶端,而不需要電腦的系統管理權限
  • 認證您的 Windows 10 應用程式

兩種驗證方法

本主題包含兩種方法來驗證對應的程式碼範例。

  • 內部驗證 - RMS SDK 所管理的 OAuth 驗證。

    如果您想要 RMS 用戶端在需要驗證時顯示 ADAL 驗證提示,請使用此方法。 如需如何設定您應用程式的詳細資訊,請參閱<內部驗證>一節。

    注意

    如果您的應用程式目前搭配使用 AD RMS SDK 2.1 與登入小幫手,則建議您使用內部驗證方法作為您的應用程式移轉路徑。

  • 外部驗證 - 您應用程式所管理的 OAuth 驗證。

    如果您想要您的應用程式管理它自己的 OAuth 驗證,請使用此方法。 使用這個方法,RMS 用戶端只有在需要驗證時才會執行應用程式所定義的回呼。 如需詳細範例,請參閱本主題結尾的<外部驗證>。

    注意

    外部驗證並不代表可以變更使用者;RMS 用戶端一律會使用所指定 RMS 租用戶的預設使用者。

內部驗證

  1. 遵循為 ADAL 驗證設定 Azure RMS 中的 Azure 設定步驟,然後回到下列應用程式初始化步驟。
  2. 您現在已經準備好設定應用程式使用 RMS SDK 2.1 所提供的內部 ADAL 驗證。

若要設定 RMS 用戶端,請在呼叫 IpcInitialize 設定 RMS 用戶端之後,立即將呼叫加入 IpcSetGlobalProperty 中。 請使用下列程式碼片段作為範例。

IpcInitialize();

IPC_AAD_APPLICATION_ID applicationId = { 0 };
applicationId.cbSize = sizeof(IPC_AAD_APPLICATION_ID);
applicationId.wszClientId = L"GUID-provided-by-AAD-for-your-app-(no-brackets)";
applicationId.wszRedirectUri = L"RedirectionUriWeProvidedAADForOurApp://authorize";
HRESULT hr = IpcSetGlobalProperty(IPC_EI_APPLICATION_ID, &applicationId);
if (FAILED(hr)) {
  //Handle the error
}

外部驗證

請使用此程式碼作為管理驗證權杖的範例。

extern HRESULT GetADALToken(LPVOID pContext, const IPC_NAME_VALUE_LIST& Parameters, __out wstring wstrToken) throw();

HRESULT GetLicenseKey(PCIPC_BUFFER pvLicense, __in LPVOID pContextForAdal, __out IPC_KEY_HANDLE &hKey)
{
    IPC_OAUTH2_CALLBACK pfGetADALToken =
    [](LPVOID pvContext, PIPC_NAME_VALUE_LIST pParameters, IPC_AUTH_TOKEN_HANDLE* phAuthToken) -> HRESULT
    {
        wstring wstrToken;
        HRESULT hr = GetADALToken(pvContext, *pParameters, wstrToken);
        return SUCCEEDED(hr) ? IpcCreateOAuth2Token(wstrToken.c_str(), OUT phAuthToken) : hr;
    };

    IPC_OAUTH2_CALLBACK_INFO callbackCredentialContext =
    {
        sizeof(IPC_OAUTH2_CALLBACK_INFO),
        pfGetADALToken,
        pContextForAdal
    };

    IPC_CREDENTIAL credentialContext =
    {
        IPC_CREDENTIAL_TYPE_OAUTH2,
        NULL
    };
    credentialContext.pcOAuth2 = &callbackCredentialContext;

    IPC_PROMPT_CTX promptContext =
    {
        sizeof(IPC_PROMPT_CTX),
        NULL,
        IPC_PROMPT_FLAG_SILENT | IPC_PROMPT_FLAG_HAS_USER_CONSENT,
        NULL,
        &credentialContext
    };

    hKey = 0L;
    return IpcGetKey(pvLicense, 0, &promptContext, NULL, &hKey);
}